我有一个逗号分隔值的varchar。我试图检查一个值是否在逗号分隔列表中。
例如,如果varchar是AAA,BBB,CCC',则检查' BBB'应该回归真实。
我正在使用STRING_SPLIT来解析以逗号分隔的列表,但匹配仅在我对第一个值的预期时起作用:
DECLARE @List VARCHAR(100) = 'AAA, BBB, CCC'
SELECT
CASE
WHEN 'AAA' IN (SELECT VALUE FROM STRING_SPLIT(@List, ',')) THEN 'true'
ELSE 'false'
END
--selects true
SELECT
CASE
WHEN 'BBB' IN (SELECT VALUE FROM STRING_SPLIT(@List, ',')) THEN 'true'
ELSE 'false'
END
--selects false
从这个Screenshot可以看出,STRING_SPLIT正在按预期分割所有值。为什么IN只检查第一个?
答案 0 :(得分:2)
这是因为除了第一个项目之外,每个项目的list
都有前导空格。
在LTRIM
功能结果中使用SPLIT_STRING
删除前导空格
DECLARE @List VARCHAR(100) = 'AAA, BBB, CCC'
SELECT
CASE
WHEN 'BBB' IN (SELECT LTRIM(VALUE) FROM STRING_SPLIT(@List, ',')) THEN 'true'
ELSE 'false'
END
结果: true
答案 1 :(得分:1)
你的'BBB'中有空间因此问题,如果你在下面使用它可以正常工作
DECLARE @List VARCHAR(100) = 'AAA, BBB, CCC'
SELECT VALUE FROM STRING_SPLIT(@List, ',')
SELECT
CASE
WHEN 'AAA' IN (SELECT VALUE FROM STRING_SPLIT(@List, ',')) THEN 'true'
ELSE 'false'
END
--selects true
SELECT
CASE
WHEN ' BBB' IN (SELECT VALUE FROM STRING_SPLIT(@List, ',')) THEN 'true'
ELSE 'false'
END