五月综合激情婷婷六月,日韩欧美国产一区不卡,他扒开我内裤强吻我下面视频 ,无套内射无矿码免费看黄,天天躁,日日躁,狠狠躁

新聞動(dòng)態(tài)

SQL Server查詢條件IN中能否使用變量的示例詳解

發(fā)布日期:2021-12-08 15:54 | 文章來(lái)源:gibhub

在SQL Server的查詢條件中,能否在IN里面使用變量呢? 如果可以的話,有沒(méi)有需要注意的地方或一些限制呢?在回答這個(gè)問(wèn)題前,我們先來(lái)看看這個(gè)例子:

IF EXISTS (SELECT 1 FROM sys.objects WHERE name='TEST' AND type='U')
BEGIN
 DROP TABLE TEST;
END
GO
CREATE TABLE TEST ( ID INT, NAME VARCHAR(16) );
GO
 
INSERT INTO dbo.TEST
SELECT 1, 'a' UNION ALL
SELECT 2, 'b' UNION ALL
SELECT 3, 'c' UNION ALL
SELECT 4, 'a,b'UNION ALL
SELECT 5, '''b'',''c''' UNION ALL
SELECT 6, '''b';
GO

如下所示,如果查詢條件里面,變量只有一個(gè)值,此時(shí)SQL是正常的。

DECLARE @name VARCHAR(16);
SET @name='a';
 
SELECT * FROM TEST WHERE name IN (@name);
GO
 
DECLARE @name VARCHAR(16);
SET @name='a,b';
 
SELECT * FROM TEST WHERE name IN (@name);
GO

如果我們想在查詢條件IN里面輸入多個(gè)值呢?假如有這樣的一個(gè)需求,一個(gè)變量里面包含b和c的值,現(xiàn)在用'b|c'作為條件傳入,對(duì)其進(jìn)行拆分為變量'b'和'c', 想查出name=b 和name=c的記錄,如下截圖所示,SQL其實(shí)并沒(méi)有按你所“設(shè)想/預(yù)想”的查出對(duì)應(yīng)記錄,而是將ID=5的記錄查出來(lái)了

DECLARE @name1 VARCHAR(16);
DECLARE @name2 VARCHAR(16);
SET @name1='b|c';
SET @name2=REPLACE(@name1,'|',''',''')
SELECT @name2
 
SELECT * FROM TEST WHERE name IN (('''' + @name2 + ''''));

下面這個(gè)SQL也是同樣的結(jié)果。

DECLARE @name1 VARCHAR(16);
DECLARE @name2 VARCHAR(16);
SET @name1='b|c';
SET @name2='''' + REPLACE(@name1,'|',''',''') +''''
SELECT @name2
 
SELECT * FROM TEST WHERE name IN (@name2 );

為什么出現(xiàn)了這樣的結(jié)果呢? 查了大量的官方文檔,沒(méi)有看到關(guān)于這個(gè)問(wèn)題的介紹和解釋。如果一定要解釋上面現(xiàn)象的情況的話,那么是因?yàn)镾ELECT * FROM TEST WHERE name IN (@name2 ); 其實(shí)轉(zhuǎn)化為了SELECT * FROM TEST WHERE name =@name2; 也就是說(shuō),上面SQL并不會(huì)按你所“設(shè)想”的邏輯運(yùn)算。而是做了一個(gè)轉(zhuǎn)換,為什么說(shuō)是這樣的一個(gè)轉(zhuǎn)換呢? 當(dāng)然這也是一個(gè)猜想,上面構(gòu)造的例子也是為了側(cè)面驗(yàn)證這個(gè)猜想,另外,上面兩個(gè)SQL實(shí)際執(zhí)行計(jì)劃的參數(shù)列表(Parameter List)也側(cè)面印證了這個(gè)猜想。如果執(zhí)行計(jì)劃解析成我們想要的結(jié)果,那么Parameter List應(yīng)該是'b' 和‘c'

解決方案:

1:使用動(dòng)態(tài)SQL

使用動(dòng)態(tài)SQL解決問(wèn)題,似乎沒(méi)啥好說(shuō)的,如下例子所示:

DECLARE @sql_cmd NVARCHAR(max);
DECLARE @name VARCHAR(16);
 
SET @name='b|c';
SET @sql_cmd='SELECT * FROM TEST WHERE name IN (''' + REPLACE(@name,'|',''',''') +''');'
 
EXEC sp_executesql @sql_cmd;

2:使用臨時(shí)表或表變量

以這個(gè)例子來(lái)說(shuō),就是將字符串拆分,放入臨時(shí)表或表變量,然后關(guān)聯(lián)表也好,在IN里面使用子查詢也OK。

3:借助STRING_SPLIT()

DECLARE @name VARCHAR(16);
 
SET @name='b|c';
SELECT *FROM test WHERE name IN (SELECT value FROM STRING_SPLIT(@name, '|'))

注意:STRING_SPLIT函數(shù)只有較高版本才支持,SQL Server 2017或SQL Server 2016部分版本支持。

4:借助XML函數(shù)來(lái)解決問(wèn)題

DECLARE @name VARCHAR(16);
DECLARE @xml_para XML;
 
SET @name = 'b|c';
SET @xml_para = CAST(( '<A>' + REPLACE(@name, '|', '</A><A>') + '</A>' ) AS XML);
 
 
SELECT *
FROM dbo.TEST
WHERE NAME IN ( SELECT A.value('.', 'varchar(max)') AS [Column]
     FROM  @xml_para.nodes('A') AS FN ( A ) );

到此這篇關(guān)于SQL Server查詢條件IN中能否使用變量的文章就介紹到這了,更多相關(guān)sqlserver條件查詢in內(nèi)容請(qǐng)搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!

版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。

相關(guān)文章

實(shí)時(shí)開(kāi)通

自選配置、實(shí)時(shí)開(kāi)通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問(wèn)服務(wù)

1對(duì)1客戶咨詢顧問(wèn)

在線
客服

在線客服:7*24小時(shí)在線

客服
熱線

400-630-3752
7*24小時(shí)客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部