Sql Server中Cross Apply關(guān)鍵字的使用 詳解
Sql Server中Cross Apply關(guān)鍵字的使用
前言
在寫一個業(yè)務(wù)的時候,有1列數(shù)據(jù)如下:
| 車牌號 |
|---|
| 湘A00001/湘G00001 |
| 湘A00002/湘G00002 |
| 湘A00003/湘G00003/湘A8888888 |
| 湘A00004/湘G00004/湘A00001 |
我的查詢條件也是車牌號,我會傳入如下參數(shù):
@PLATE_NO '湘A00003/湘G00003/湘A8888888'
我需要判斷我傳入的車牌號是否包含上面的列數(shù)據(jù),舉例上面的表為B表,那么B表列中的車牌號,我的PLATE_NO參數(shù)需要包含里面所有的車牌號。
一個簡單的包含關(guān)系,我會用拆分函數(shù)去拆分我傳入的參數(shù),然后去比對參數(shù)是否包含B表的車牌號。對于參數(shù)處理很簡單,但是B表的多行,那么該如何去處理B表的列呢?
Cross Apply介紹
在 SQL Server 中,Cross Apply 關(guān)鍵字主要用于從一個表中獲取數(shù)據(jù),并對每一行數(shù)據(jù)應(yīng)用一個表值函數(shù),然后返回函數(shù)的結(jié)果。這個關(guān)鍵字允許你在右側(cè)的表達式中引用左側(cè)表的列。
Cross Apply 和 Inner Join 類似,只返回匹配的記錄。如果沒有匹配的記錄,那么就不會返回任何結(jié)果。
思路
首先肯定需要通過‘/’拆分獲得車牌號數(shù)據(jù),將湘A00003/湘G00003/湘A8888888變成如下格式
| col |
|---|
| 湘A00003 |
| 湘G00003 |
| 湘A8888888 |
那么B表該如何去實現(xiàn),它有多行數(shù)據(jù),多行數(shù)據(jù)如何拆分成一列。
代碼實現(xiàn)
首先我們需要有一個表值函數(shù)來拆分字符串:
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)
);實現(xiàn)方式很多,我這里直接讓GPT生成了一個,執(zhí)行上述代碼即可完成拆分函數(shù)創(chuàng)建,調(diào)用如下:
SELECT Item FROM dbo.SplitString('湘A00003/湘G00003/湘A8888888', '/');對于B表的操作,就需要使用到Cross Apply關(guān)鍵字了,我對每一行數(shù)據(jù)車票號進行拆分操作,然后將數(shù)據(jù)存于臨時表,并去重處理。
SELECT DISTINCT split.col INTO #TEMP FROM B CROSS APPLY dbo.SplitString(車牌號, '/') AS split;
拆分結(jié)果如下
| col |
|---|
| 湘A00001 |
| 湘G00001 |
| 湘A00002 |
| ... |
然后在進行比對查詢
將參數(shù)存放在TEMP01臨時表,將B表拆分的數(shù)據(jù)存于TEMP02臨時表,然后使用CASE WHEN以TEMP02為主表判斷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結(jié)果如下,這里只是舉例子,主要是體現(xiàn)Cross Apply的作用。


總結(jié)
簡單來說 Cross Apply 看作是 SQL Server 中的一個"循環(huán)"操作。對于你在左邊的表中的每一行數(shù)據(jù),Cross Apply 都會執(zhí)行一次右邊的查詢。我上述的操作就是多列數(shù)據(jù)使用實現(xiàn)Cross Apply循環(huán)拆分每行數(shù)據(jù)的車牌號列。
到此這篇關(guān)于Sql Server中Cross Apply關(guān)鍵字的使用 的文章就介紹到這了,更多相關(guān)Sql Server Cross Apply關(guān)鍵字內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SQL Server"錯誤 21002: [SQL-DMO]用戶 * 已經(jīng)存在問題解決
在分配數(shù)據(jù)庫登錄用戶的數(shù)據(jù)庫訪問權(quán)限的時候出現(xiàn)這種錯誤,如果選中某一個數(shù)據(jù)庫的任何一個角色就會出現(xiàn)這個錯誤2009-04-04
Cont()與Where().Count()有時性能差別如此之大!
今天在修改后臺用戶公司管理列表時,發(fā)現(xiàn)列表加載超慢的bug!好幾十秒??!數(shù)據(jù)是相對其他的列表是稍微多點,不過也就4000多條,之前是好的,為啥這么慢呢?2010-03-03
SQLServer2014故障轉(zhuǎn)移群集的部署的圖文教程
本文主要介紹了SQLServer2014故障轉(zhuǎn)移群集的部署的圖文教程,文中通過圖文介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01
基于Microsoft SQL Server實現(xiàn)編寫漢字轉(zhuǎn)拼音函數(shù)
在搜索應(yīng)用中,我們一般會提供一個搜索框,輸入關(guān)健字,點擊查詢按鈕以獲取結(jié)果數(shù)據(jù),大部分情況我們會提供模糊查詢的形式以在一個或多個字段進行搜索以獲取結(jié)果,本文給大家就介紹了基于Microsoft SQL Server實現(xiàn)編寫漢字轉(zhuǎn)拼音函數(shù),需要的朋友可以參考下2024-03-03
自動備份mssql server數(shù)據(jù)庫并壓縮的批處理腳本
windows下,使用mssql命令行工具sqlcmd備份數(shù)據(jù)庫,并調(diào)用rar壓縮;不借助mssql"維護計劃"功能,拜托權(quán)限問題。2011-07-07
SQLSERVER調(diào)用C#的代碼實現(xiàn)
本文主要介紹了SQLSERVER調(diào)用C#的代碼實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01
配置Windows防火墻允許SQL?Server遠程連接的實現(xiàn)
防火墻系統(tǒng)有助于阻止對計算機資源進行未經(jīng)授權(quán)的訪問,?如果防火墻已打開但卻未正確配置,則可能會阻止連接SQL,本文主要介紹了配置Windows防火墻允許SQL?Server遠程連接的實現(xiàn),感興趣的可以了解一下2024-04-04

