【问题标题】:T-SQL - Verify that all values are included in the result of a select statementT-SQL - 验证选择语句的结果中是否包含所有值
【发布时间】:2018-09-28 19:30:57
【问题描述】:

假设我有一个函数,我在其中传递一个逗号分隔的值列表。然后我有另一个返回表格的函数。如何验证逗号分隔列表中的每个值都包含在第二个函数的结果中?如果逗号分隔列表包含的值不在第二个函数的结果中,则结果必须为 FALSE。

有效场景:

输入:A、B、C

第二个函数的结果:A、B、C、D

无效场景:

输入:A、B、C、D

第二个函数的结果:A、B、C

提前致谢。

【问题讨论】:

  • 请注意,逗号分隔列表不是在 T-SQL 中对多个数据项建模的好方法。 T-SQL 具有设计 用于保存多个值(表本身、XML、JSON)的类型。使用不是为保存多个值而设计的类型(例如包含逗号和其他字符的字符串,然后必须解析shredded)只会给您的工作增加复杂性。跨度>

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


【解决方案1】:

类似这样的:

DECLARE @input VARCHAR(100)='1,3,4';

WITH splittedInput AS
(
    SELECT val.value('text()[1]','int') As theInt
    FROM
    (
        SELECT CAST('<x>' + REPLACE(@input,',','</x><x>') + '</x>' AS XML) AS singleValue
    ) AS x
    CROSS APPLY x.singleValue.nodes('/x') As y(val)
)
SELECT *
FROM splittedInput AS si 
LEFT JOIN (VALUES(1),(2),(3),(4)) AS t(x) ON t.x=si.theInt
WHERE t.x IS NULL;

单独运行这部分

    SELECT val.value('text()[1]','int') As theInt
    FROM
    (
        SELECT CAST('<x>' + REPLACE(@input,',','</x><x>') + '</x>' AS XML) AS singleValue
    ) AS x
    CROSS APPLY x.singleValue.nodes('/x') As y(val)

您会看到,这会将逗号分隔的输入作为派生表返回。

如果您使用的是 SQL Server 2016+,则可以使用 STRING_SPLIT(),这会使整个事情变得更加简单。

该示例使用VALUES 创建一个模拟结果 以返回1、2、3 和4。LEFT JOIN 将返回所有结果值以及可连接的输入值。如果没有,它将是NULL。在没有WHERE 子句的情况下运行它以查看差异。

尝试为您的输入添加一个值,该值未包含在输出中,然后再次尝试该脚本。

更新

像这样的SELECT

SELECT CASE WHEN COUNT(*)>0 THEN 0 ELSE 1 END AS ResultIsValid

如果需要,您会得到一个 01 来标记返回的有效性。

更新 2:使用STRING_SPLIT()

MS 在 2016 版中引入了一些新的字符串方法,one of them is STRING_SPIT()

我目前无法对此进行测试(需要 SQL-Server 2016+),但这应该可以工作

SELECT *
FROM STRING_SPLIT(@input,',') AS ss 
LEFT JOIN (VALUES(1),(2),(3),(4)) AS t(x) ON t.x=ss.value
WHERE t.x IS NULL;

【讨论】:

  • 谢谢。是的,我们使用 SQL Server 2016+
  • @DraženJanjiček 查看我的更新 2
猜你喜欢
  • 2021-02-21
  • 2017-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-27
  • 2013-10-18
  • 1970-01-01
  • 2016-11-13
相关资源
最近更新 更多