翼度科技»论坛 编程开发 .net 查看内容

Sql Server中Cross Apply关键字的使用

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
Sql Server中Cross Apply关键字的使用

前言

在写一个业务的时候,有1列数据如下:
车牌号湘A00001/湘G00001湘A00002/湘G00002湘A00003/湘G00003/湘A8888888湘A00004/湘G00004/湘A00001我的查询条件也是车牌号,我会传入如下参数:
  1. @PLATE_NO '湘A00003/湘G00003/湘A8888888'
复制代码
我需要判断我传入的车牌号是否包含上面的列数据,举例上面的表为B表,那么B表列中的车牌号,我的PLATE_NO参数需要包含里面所有的车牌号。
一个简单的包含关系,我会用拆分函数去拆分我传入的参数,然后去比对参数是否包含B表的车牌号。对于参数处理很简单,但是B表的多行,那么该如何去处理B表的列呢?
Cross Apply介绍

在 SQL Server 中,Cross Apply 关键字主要用于从一个表中获取数据,并对每一行数据应用一个表值函数,然后返回函数的结果。这个关键字允许你在右侧的表达式中引用左侧表的列。
Cross Apply 和 Inner Join 类似,只返回匹配的记录。如果没有匹配的记录,那么就不会返回任何结果。
思路

首先肯定需要通过‘/’拆分获得车牌号数据,将湘A00003/湘G00003/湘A8888888变成如下格式
col湘A00003湘G00003湘A8888888那么B表该如何去实现,它有多行数据,多行数据如何拆分成一列。
代码实现

首先我们需要有一个表值函数来拆分字符串:
  1. CREATE FUNCTION dbo.SplitString
  2. (
  3.     @List NVARCHAR(MAX),
  4.     @Delim NVARCHAR(255)
  5. )
  6. RETURNS TABLE
  7. AS
  8. RETURN
  9. (
  10.     SELECT Item = y.i.value('(./text())[1]', 'nvarchar(4000)')
  11.     FROM
  12.     (
  13.         SELECT x = CONVERT(XML, '<i>'
  14.         + REPLACE(@List, @Delim, '</i><i>')
  15.         + '</i>').query('.')
  16.     ) AS a CROSS APPLY x.nodes('i') AS y(i)
  17. );
复制代码
实现方式很多,我这里直接让GPT生成了一个,执行上述代码即可完成拆分函数创建,调用如下:
  1. SELECT Item FROM dbo.SplitString('湘A00003/湘G00003/湘A8888888', '/');
复制代码
对于B表的操作,就需要使用到Cross Apply关键字了,我对每一行数据车票号进行拆分操作,然后将数据存于临时表,并去重处理。
  1. SELECT DISTINCT
  2. split.col
  3. INTO #TEMP
  4. FROM B
  5. CROSS APPLY dbo.SplitString(车牌号, '/') AS split;
复制代码
拆分结果如下
col湘A00001湘G00001湘A00002...然后在进行比对查询
将参数存放在TEMP01临时表,将B表拆分的数据存于TEMP02临时表,然后使用CASE WHEN以TEMP02为主表判断TEMP01列是否存在与02中,不能存在则新建一列赋值为0
  1. SELECT
  2. P.Item,
  3. CASE
  4. WHEN EXISTS
  5. (
  6. SELECT 1 FROM TEMP01 WHERE Item = P.Item
  7. )          THEN
  8.     1
  9. ELSE
  10.     0
  11. END AS ISBOOL
  12. FROM TEMP02 P
复制代码
结果如下,这里只是举例子,主要是体现Cross Apply的作用。


总结

简单来说 Cross Apply 看作是 SQL Server 中的一个"循环"操作。对于你在左边的表中的每一行数据,Cross Apply 都会执行一次右边的查询。我上述的操作就是多列数据使用实现Cross Apply循环拆分每行数据的车牌号列。

来源:https://www.cnblogs.com/ZYPLJ/archive/2023/11/12/17826882.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具