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. 6个实例带你解读TinyVue 组件库跨框架技术

    本文分享自华为云社区<6个实例带你解读TinyVue 组件库跨框架技术>,作者: 华为云社区精选. 在DTSE Tech Talk <手把手教你实现mini版TinyVue组件库&g ...

  2. Solution Set - 数学相关

    CF645F Link&Submission. 利用 \(\sum\limits_{d|n}\varphi(\frac{n}{d})=n\),只要对每个数 \(x\),求出 \(cnt_x\) ...

  3. 钉消息Markdown语法

    支持的Markdown语法 1 标题 2 # 一级标题 3 ## 二级标题 4 ### 三级标题 5 #### 四级标题 6 ##### 五级标题 7 ###### 六级标题 8 9 引用 10 &g ...

  4. nvm环境安装

    目录 nvm是什么 使用背景 nvm的坑. nvm,node,npm之间的区别. nvm.nodejs.npm的关系: nvm-windows下载地址 安装 linux . mac 源码包下载地址 解 ...

  5. Google C++ 语言规范

    1. 命名空间 KeyNotes: 鼓励在.cc文件里使用匿名命名空间或者sttic声明 禁止使用内联命令空间,X::Y::foo 等价与X::foo.其主要用于跨版本的ABI兼容问题 namespa ...

  6. Django 安全性与防御性编程:如何保护 Django Web 应用

    title: Django 安全性与防御性编程:如何保护 Django Web 应用 date: 2024/5/13 20:26:58 updated: 2024/5/13 20:26:58 cate ...

  7. Angular快速生成文件基本命令

    ng new 作用:创建一个已被初始化的Angular应用 命令选项 参数 说明 --collection -c 指定工程模板 属于高阶操作,暂不知道如何使用 --directory 指定新项目创建的 ...

  8. winform 关于无边框和拖动窗体边缘改变尺寸的 踩坑笔记

    在做美化winform窗体,实现自定义窗体标题栏,圆角边框,并且支持拖拽窗体,最后还要能拖动窗体左.右.下边缘时,改变窗体的宽和高. 一般网上的都有代码,窗体设成无边框,自己加个panel就能实现自定 ...

  9. Vue cli路由

    上面是将Forecast组件作为了Home的子组件使用,现在我们将其作为一个路由组件使用. 在router/index.js路由系统注册路由: { path: '/forecast', name: ' ...

  10. Vue——基本使用

    Vue.js 的核心是一个允许采用简洁的模板语法来声明式地将数据渲染进 DOM 的系统.我们不再和 HTML 直接交互了.一个 Vue 应用会将其挂载到一个 DOM 元素上 (对于这个例子是 #app ...