濮阳杆衣贸易有限公司

主頁 > 知識庫 > SQL Server查詢條件IN中能否使用變量的示例詳解

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

熱門標(biāo)簽:實體店地圖標(biāo)注怎么標(biāo) 股票配資電銷機(jī)器人 電銷機(jī)器人 深圳 地圖標(biāo)注如何弄全套標(biāo) 在電子版地圖標(biāo)注要收費(fèi)嗎 萬利達(dá)綜合醫(yī)院地圖標(biāo)注點(diǎn) 武漢AI電銷機(jī)器人 外呼系統(tǒng)會封嗎 南京電銷外呼系統(tǒng)哪家好

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

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

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

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 + ''''));

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

解決方案:

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

使用動態(tài)SQL解決問題,似乎沒啥好說的,如下例子所示:

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:使用臨時表或表變量

以這個例子來說,就是將字符串拆分,放入臨時表或表變量,然后關(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ù)來解決問題

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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • sqlserver和oracle中對datetime進(jìn)行條件查詢的一點(diǎn)區(qū)別小結(jié)
  • MySql帶OR關(guān)鍵字的多條件查詢語句
  • Mysql帶And關(guān)鍵字的多條件查詢語句
  • SQL 多條件查詢幾種實現(xiàn)方法詳細(xì)介紹
  • linq to sql 中,如何解決多條件查詢問題,答案,用表達(dá)式樹! (下)
  • linq to sql中,如何解決多條件查詢問題,答案,用表達(dá)式樹!
  • MySQL中使用case when 語句實現(xiàn)多條件查詢的方法

標(biāo)簽:安徽 泰安 武威 濟(jì)寧 廣東 濟(jì)源 汕頭 臺州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《SQL Server查詢條件IN中能否使用變量的示例詳解》,本文關(guān)鍵詞  SQL,Server,查詢,條件,中,能否,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《SQL Server查詢條件IN中能否使用變量的示例詳解》相關(guān)的同類信息!
  • 本頁收集關(guān)于SQL Server查詢條件IN中能否使用變量的示例詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    乌拉特前旗| 彰化县| 伊川县| 乳山市| 新安县| 湘潭市| 秦皇岛市| 兴安盟| 广东省| 庄河市| 凌源市| 修文县| 台北市| 葫芦岛市| 凯里市| 台东市| 张家口市| 苍溪县| 申扎县| 会东县| 永仁县| 高邑县| 七台河市| 邵东县| 博湖县| 建平县| 堆龙德庆县| 尚义县| 报价| 南宁市| 雷山县| 横山县| 万盛区| 调兵山市| 内乡县| 若尔盖县| 长兴县| 大港区| 科尔| 邻水| 浦城县|