我有一个简单的查询:
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 ALL
s,例如
;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, ','))
0 评论