【问题标题】:IN only matches on first value when using STRING_SPLIT使用 STRING_SPLIT 时,IN 仅匹配第一个值
【发布时间】:2016-10-14 17:13:18
【问题描述】:

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

例如,如果 varchar 是 'AAA, BBB, CCC',检查 'BBB' 应该返回 true。

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

【问题讨论】:

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


    【解决方案1】:

    这是因为您在list 中为除第一个 项之外的每个项都有前导 空间。

    SPLIT_STRING函数结果中使用LTRIM去除前导空格

    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

    【讨论】:

    • 哎呀。像往常一样,魔鬼在细节中。感谢您的帮助。
    【解决方案2】:

    你的“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
    

    【讨论】:

    • 感谢您的回答。我接受了@Prdp,因为他击败了你,但我非常感谢你抽出时间提供信息。
    • 欢迎...欣赏最佳答案...我也认为 ltrim 是更好的方法...
    猜你喜欢
    • 1970-01-01
    • 2021-03-01
    • 2021-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-02
    • 2016-10-21
    • 2010-11-18
    相关资源
    最近更新 更多