我有一個簡單的查詢:
declare @manual varchar(80) = '''Discount'',''Misc Charges'''
select *
from #Final
where charge_type in (@manual)
現在我已經通過使用以下PRINT命令驗證我宣告的變數是否正確設定:PRINT '''Discount'',''Misc Charges'''并且它實際上回傳了我所期望的:'Discount','Misc Charges'。
但是,當我運行此查詢時,我沒有得到任何結果。
如果我只是簡單地使用:
select *
from #Final
where charge_type in ('Discount','Misc Charges')
然后沒問題,我得到了我的結果。我敢肯定,一旦我得到答案,我會踢自己,但就目前而言,這是沒有意義的。沒有錯誤,只是沒有給我沒有任何行的列,就好像沒有資料一樣。我錯過了什么?
uj5u.com熱心網友回復:
因為
IN ('''Discount'',''Misc Charges''')
是相同的
= '''Discount'',''Misc Charges'''
換句話說,這是一個包含一堆轉義字串分隔符的單個字串,而不是單個字串值的逗號分隔串列。這就是為什么你可以在沒有 SQL Server barfing 的情況下做到這一點:
PRINT '''Discount'',''Misc Charges''';
你想要的是:
declare @manual varchar(80) = 'Discount,Misc Charges';
select f.*
from #Final AS f
INNER JOIN STRING_SPLIT(@manual, ',') AS s
ON f.charge_type = s.value;
但是,這可能會在 compatibility_level < 130 時失敗,在這種情況下:
declare @manual varchar(80) = 'Discount,Misc Charges';
select f.*
from #Final AS f
INNER JOIN
OPENJSON('["' REPLACE(@manual, ',', '","') '"]') AS s
ON f.charge_type = s.value;
在后一種情況下,您可以通過在變數宣告中使用稍微不同的自升式字串來使查詢本身更好一些:
declare @manual varchar(80) = '["Discount","Misc Charges"]';
select f.*
from #Final AS f
INNER JOIN
OPENJSON(@manual) AS s ON f.charge_type = s.value;
或者,如果您使用的是舊版本并且您確實是行內手工制作這些字串,您可以使用表變數或 CTE,如 @SMor 建議的那樣。
表變數:
DECLARE @d table(str varchar(32));
INSERT @d VALUES('Discount'),('Misc Charges');
SELECT f.*
from #Final AS f
INNER JOIN @d AS d
ON f.charge_type = d.str;
熱電偶:
;WITH cte AS
(
SELECT str = 'Discount'
UNION ALL
SELECT str = 'Misc Charges'
)
SELECT f.*
from #Final AS f
INNER JOIN cte
ON f.charge_type = cte.str;
如果你在某個時候會有更多的值,它提示撰寫一個表建構式而不是多個UNION ALLs,例如
;WITH cte AS
(
SELECT str FROM
(
VALUES('Discount','Misc Charges')
) AS s(str)
)
SELECT f.*
from #Final AS f
INNER JOIN cte
ON f.charge_type = cte.str;
uj5u.com熱心網友回復:
您可以只使用您的值串列作為逗號分隔的字串,然后使用 STRING_SPLIT。
declare @manual varchar(80) = 'Discount,Misc Charges'
select *from #Final
where charge_type in (SELECT * from STRING_SPLIT(@manual,',))
uj5u.com熱心網友回復:
這是 SQL Server 2016 及更高版本中要做的事情。
SQL
DECLARE @manual VARCHAR(80) = 'Discount,Misc Charges';
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, charge_type VARCHAR(30));
INSERT INTO @tbl (charge_type) VALUES
('Discount'),
('No Discount'),
('Misc Charges');
SELECT *
FROM @tbl
WHERE charge_type in (SELECT value FROM STRING_SPLIT(@manual, ','))
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/407803.html
標籤:
