Sql Server中Cross Apply关键字的使用

前言

在写一个业务的时候,有1列数据如下:

车牌号
湘A00001/湘G00001
湘A00002/湘G00002
湘A00003/湘G00003/湘A8888888
湘A00004/湘G00004/湘A00001

我的查询条件也是车牌号,我会传入如下参数:

@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表该如何去实现,它有多行数据,多行数据如何拆分成一列。

代码实现

首先我们需要有一个表值函数来拆分字符串:

CREATE FUNCTION dbo.SplitString
(
@List NVARCHAR(MAX),
@Delim NVARCHAR(255)
)
RETURNS TABLE
AS
RETURN
(
SELECT Item = y.i.value('(./text())[1]', 'nvarchar(4000)')
FROM
(
SELECT x = CONVERT(XML, '<i>'
+ REPLACE(@List, @Delim, '</i><i>')
+ '</i>').query('.')
) AS a CROSS APPLY x.nodes('i') AS y(i)
);

实现方式很多,我这里直接让GPT生成了一个,执行上述代码即可完成拆分函数创建,调用如下:

SELECT Item FROM dbo.SplitString('湘A00003/湘G00003/湘A8888888', '/');

对于B表的操作,就需要使用到Cross Apply关键字了,我对每一行数据车票号进行拆分操作,然后将数据存于临时表,并去重处理。

SELECT DISTINCT
split.col
INTO #TEMP
FROM B
CROSS APPLY dbo.SplitString(车牌号, '/') AS split;

拆分结果如下

col
湘A00001
湘G00001
湘A00002
...

然后在进行比对查询

将参数存放在TEMP01临时表,将B表拆分的数据存于TEMP02临时表,然后使用CASE WHENTEMP02为主表判断TEMP01列是否存在与02中,不能存在则新建一列赋值为0

SELECT
P.Item,
CASE
WHEN EXISTS
(
SELECT 1 FROM TEMP01 WHERE Item = P.Item
) THEN
1
ELSE
0
END AS ISBOOL
FROM TEMP02 P

结果如下,这里只是举例子,主要是体现Cross Apply的作用。

总结

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

Sql Server中Cross Apply关键字的使用的更多相关文章

  1. SQL Server中CROSS APPLY和OUTER APPLY应用

    1.什么是Cross Apply和Outer Apply ? 我们知道SQL Server 2000中有Cross Join用于交叉联接的.实际上增加Cross Apply和Outer Apply是用 ...

  2. SQL Server中CROSS APPLY和OUTER APPLY的应用详解

    SQL Server数据库操作中,在2005以上的版本新增加了一个APPLY表运算符的功能.新增的APPLY表运算符把右表表达式应用到左表表达式中的每一行.它不像JOIN那样先计算那个表表达式都可以, ...

  3. SQL Server ->> 使用CROSS APPLY语句是遇到聚合函数中包含外部引用列时报错

    本次遇到的问题是CROSS APPLY的内部查询语句中的聚合函数包含CASE WHEN判断,且同时又内部语句的表的列和外部引用的表的列,此时会报下列的错误. 消息 8124,级别 16,状态 1,第 ...

  4. SQL Server中的Merge关键字

    本文转载地址:http://www.cnblogs.com/CareySon/archive/2012/03/07/2383690.html 简介 Merge关键字是一个神奇的DML关键字.它在SQL ...

  5. SQL Server中的Merge关键字 更新表数据

    简介 Merge关键字是一个神奇的DML关键字.它在SQL Server 2008被引入,它能将Insert,Update,Delete简单的并为一句.MSDN对于Merge的解释非常的短小精悍:”根 ...

  6. 【转载】SQL Server中的Merge关键字

    简介 原文地址 Merge关键字是一个神奇的DML关键字.它在SQL Server 2008被引入,它能将Insert,Update,Delete简单的并为一句.MSDN对于Merge的解释非常的短小 ...

  7. SQL Server中的Merge关键字(转载)

    简介 Merge关键字是一个神奇的DML关键字.它在SQL Server 2008被引入,它能将Insert,Update,Delete简单的并为一句.MSDN对于Merge的解释非常的短小精悍:”根 ...

  8. SQL Server 中的Merge关键字(转载)

    简介 Merge关键字是一个神奇的DML关键字.它在SQL Server 2008被引入,它能将Insert,Update,Delete简单的并为一句.MSDN对于Merge的解释非常的短小精悍:”根 ...

  9. SQL Server 关于CROSS APPLY 和 OUTER APPLY应用

    先看看语法: <left_table_expression>  {cross|outer} apply<right_table_expression> 再让我们了解一下appl ...

  10. SQL Server之Cross apply

    1 --这样是不行的 2 select sys.dm_exec_sql_text(most_recent_sql_handle) from sys.dm_exec_connections 3 4 -- ...

随机推荐

  1. Sentinel如何持久化数据到Nacos?

    默认情况下 Sentinel 只能接收到 Nacos 推送的消息,但不能将自己控制台修改的信息同步给 Nacos,如下图所示: 但是在生成环境下,我们为了更方便的操作,是需要将 Sentinel 控制 ...

  2. SQL server 批量删除表

    select 'drop table '+name+';' from sys.tables declare c cursor forselect NAME from sysobjects where ...

  3. LVGL 字体

    一.LVGL 内置字体 LVGL有几种不同大小的内置字体,可以通过 LV_FONT_MONTSERRAT_X 定义在 lv_conf.h 中启用. 普通字体 包含所有ASCII字符,度数符号(U + ...

  4. 引爆你的网页乐趣!前端十个令人捧腹的JavaScript整蛊代码。

    愚人节整蛊代码.想要在网页上增添一抹幽默与惊喜吗?或是想给你的朋友一个意想不到的"小惊喜"?那么,这十款简单而有趣的JavaScript前端整蛊代码绝对能满足你的需求!每一个代码都 ...

  5. ubuntu系统下安装最新版的MySQL

    目录 下载mysql源 视频地址 原文章地址 下载mysql源 打开mysql官网 mysql官网文档 进入下载地址页面 下载mysql源 apt-get install -y wget #如果没有w ...

  6. 如何在docker环境下的纯净ubuntu系统中安装最新版nginx

    原文件地址: https://www.cnblogs.com/taoshihan/p/11588269.html 视频地址: https://www.bilibili.com/video/av6898 ...

  7. nim 5. 读写文件

    读文件 假设nim程序相同的文件夹下,有个people.txt文件,内容如下: Alice A. Bob B. Carol C. 读取这个文件的代码 import strutils let conte ...

  8. OpenOCD + DAP-LINK调试ESP32的失败经历

    目的 手里有调试STM32的DAP-LINK,想试试通过JTAG调试ESP32 OpenOCD支持CMSIS-DAP DAP-LINK支持的芯片,我手上这款描述如下,应该JTAG协议的都支持 平台 w ...

  9. 二:nacos 的服务注册

    一:怎么引用依赖 dependencyManagement:spring cloud alibaba 的版本,由于spring cloud alibaba 还未纳入spring cloud 的主版本管 ...

  10. RocketMQ主从同步原理

    一. 主从同步概述 主从同步这个概念相信大家在平时的工作中,多少都会听到.其目的主要是用于做一备份类操作,以及一些读写分离场景.比如我们常用的关系型数据库mysql,就有主从同步功能在. 主从同步,就 ...