在使用STRING_SPLIT

时间:2016-10-14 17:13:18

标签: sql-server split sql-server-2016

我有一个逗号分隔值的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只检查第一个?

2 个答案:

答案 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