IN 仅在使用 STRING_SPLIT 时匹配第一个值

IN only matches on first value when using STRING_SPLIT

我有一个逗号分隔值的 varchar。我正在尝试检查一个值是否在逗号分隔列表中。

例如,如果 varchar 是 'AAA, BBB, CCC',检查 'BBB' 应该 return 为真。

我正在使用 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 只检查第一个?

这是因为除了 第一个 项目之外,每个项目的 list 中都有 Leading space。

SPLIT_STRING 函数结果中使用 LTRIM 删除前导 space

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

您的“BBB”中有 space,因此出现问题,如果您使用下面的方法,它会正常工作

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