首页 > 数据库 >Sql Server中Cross Apply关键字的使用

Sql Server中Cross Apply关键字的使用

时间:2023-11-12 12:12:08浏览次数:37  
标签:Cross 车牌号 Server G00003 拆分 Sql Apply SELECT

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的作用。

image

image

总结

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

标签:Cross,车牌号,Server,G00003,拆分,Sql,Apply,SELECT
From: https://www.cnblogs.com/ZYPLJ/p/17826882.html

相关文章

  • mysql 主从复制
    本地启动了三台虚拟机,分别是,cdh1(192.168.56.121)、cdh2(192.168.56.122)、cdh3(192.168.56.123)其中cdh1是主库,cdh2、cdh3是从库需要提前对三个库都把测试库创建好:CREATEDATABASE`mytest`DEFAULTCHARACTERSET'utf8mb4'DEFAULTCOLLATE'utf8mb4_general_ci';然后我......
  • mysql log_bin整理
    二进制日志记录开关,二进制日志用于记录mysql数据更新的日志文件,对于非变更数据的操作不予记录,比如select、show等。showvariableslike'log_bin';mysql>showvariableslike'log_bin';+---------------+-------+|Variable_name|Value|+---------------+-------+|......
  • Java基础、MySQL数据库、Web前端
    三、简答题(共10题,共30分)1、请写出CSS的6种选择器,并举例?l 标签选择器:a、li、div、table等等l 类选择器:.nav、.itemsl id选择器:#logo、#item1l 通配符选择器:*l 后代选择器:ulli、divaspan等l 并集选择器:li,div,h1l 交集选择器:li.item、input.username等2、将图片展示在网页......
  • MySQL:日期时间函数整理
    文档https://www.w3schools.cn/sql/sql_ref_mysql.htmlhttps://dev.mysql.com/doc/refman/8.0/en/built-in-function-reference.html(目录)获取日期时间函数描述NOW返回当前日期和时间CURDATE返回当前日期CURRENT_DATE返回当前日期CURRENT_TIME返回当......
  • ThinkPHP5漏洞分析之SQL注入1
    漏洞概要本次漏洞存在于Builder类的parseData方法中。由于程序没有对数据进行很好的过滤,将数据拼接进SQL语句,导致SQL注入漏洞的产生。漏洞影响版本:5.0.13<=ThinkPHP<=5.0.15、5.1.0<=ThinkPHP<=5.1.5。漏洞环境通过以下命令获取测试环境代码:composercreate-proje......
  • ThinkPHP5漏洞分析之SQL注入2
    漏洞概要本次漏洞存在于Mysql类的parseArrayData方法中由于程序没有对数据进行很好的过滤,将数据拼接进SQL语句,导致SQL注入漏洞的产生。漏洞影响版本:5.1.6<=ThinkPHP<=5.1.7(非最新的5.1.8版本也可利用)。漏洞环境通过以下命令获取测试环境代码:composercreate-pro......
  • ThinkPHP5漏洞分析之SQL注入3
    漏洞概要本次漏洞存在于Mysql类的parseWhereItem方法中。由于程序没有对数据进行很好的过滤,将数据拼接进SQL语句,导致SQL注入漏洞的产生。漏洞影响版本:ThinkPHP5全版本。漏洞环境通过以下命令获取测试环境代码:composercreate-project--prefer-disttopthink/think=......
  • ThinkPHP5漏洞分析之SQL注入4
    漏洞概要本次漏洞存在于Mysql类的parseWhereItem方法中。由于程序没有对数据进行很好的过滤,直接将数据拼接进SQL语句。再一个,Request类的filterValue方法漏过滤NOTLIKE关键字,最终导致SQL注入漏洞的产生。漏洞影响版本:ThinkPHP=5.0.10。漏洞环境通过以下命令获......
  • ThinkPHP5漏洞分析之SQL注入5
    漏洞概要本次漏洞存在于Builder类的parseOrder方法中。由于程序没有对数据进行很好的过滤,直接将数据拼接进SQL语句,最终导致SQL注入漏洞的产生。漏洞影响版本:5.1.16<=ThinkPHP5<=5.1.22。漏洞环境通过以下命令获取测试环境代码:composercreate-project--prefer-dist......
  • ThinkPHP5漏洞分析之SQL注入6
    漏洞概要本次漏洞存在于所有Mysql聚合函数相关方法。由于程序没有对数据进行很好的过滤,直接将数据拼接进SQL语句,最终导致SQL注入漏洞的产生。漏洞影响版本:5.0.0<=ThinkPHP<=5.0.21、5.1.3<=ThinkPHP5<=5.1.25。不同版本payload需稍作调整:5.0.0~5.0.21、5.1.3~5.1.......