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
我有一个逗号分隔值的 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