【问题标题】:Compare comma separated list with individual row in table将逗号分隔的列表与表中的单个行进行比较
【发布时间】:2014-07-06 11:55:46
【问题描述】:

我必须将逗号分隔的值与表中的列进行比较,并找出哪些值不在数据库中。 [主数据验证的种类]。请看下面的示例数据:

数据库中的表数据:

id   name
1    abc
2    def
3    ghi

SQL 部分:

在这里,我得到了逗号分隔的列表,例如 ('abc','def','ghi','xyz')。 现在xyz 是无效值,所以我想获取该值并将其作为输出返回,说“无效值”。

如果我拆分这些值,将其放入临时表中,循环遍历每个值并一一比较,这是可能的。

但是还有其他最佳方法吗??

【问题讨论】:

  • 谷歌搜索SQL Server Split Function
  • 我已经在使用 split 函数来分隔值。但是我需要检查单个值还是可以在单个查询中检查它?
  • Parameterize a SQL IN clause 的可能重复项

标签: sql sql-server sql-server-2005


【解决方案1】:

我确定我的问题是否正确,但是,我个人会尝试解决这样的问题:

SELECT
    D.id,
    CASE 
        WHEN B.Name IS NULL THEN D.name
        ELSE "invalid value"
    END
FROM
    data AS D
    INNER JOIN badNames B   ON  b.Name = d.Name
    --as SQL is case insensitive, equal sign should work

如果您愿意,可以使用一个名称错误或无效值的表。这也可以是一个临时表 - 取决于使用情况(黑名单单词应该是一个表,服务提供的临时无效值应该是临时表等)。

注意:上面的选择可以嵌套在视图中,因此数据保持原样,但您可以获得正确性信息。否则我会在一个函数中创建一个光标,该函数将像上面那样通过选择并更改原始数据,如果这是目标的话......

【讨论】:

    【解决方案2】:

    听起来你只需要一个 NOT EXISTS / LEFT JOIN,如:

    SELECT tmp.InvalidValue
    FROM   dbo.HopeThisIsNotAWhileBasedSplit(@CSVlist) tmp
    WHERE  NOT EXISTS (
                        SELECT *
                        FROM   dbo.Table tbl
                        WHERE  tbl.Field = tmp.InvalidValue
                      );
    

    当然,根据传入的 CSV 列表的大小、您正在检查的表中的行数以及您使用的拆分器样式,最好先将 CSV 转储到临时表中(正如你在问题中提到的那样)。

    【讨论】:

      【解决方案3】:

      尝试以下查询:

      SELECT  SplitedValues.name, 
              CASE WHEN YourTable.Id IS NULL THEN 'invalid value' ELSE NULL END AS Result
      FROM SplitedValues 
      LEFT JOIN yourTable ON SplitedValues.name = YourTable.name
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-05-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-18
        • 1970-01-01
        • 2017-04-20
        相关资源
        最近更新 更多