将逗号分隔列表与表中的单个行进行比较

时间:2014-07-05 22:59:46

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

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

数据库中的表数据:

id   name
1    abc
2    def
3    ghi

SQL部分:

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

如果我将这些值分开,可以将它放在临时表中,循环遍历每个值并逐个进行比较。

但还有其他最佳方法吗?

3 个答案:

答案 0 :(得分:0)

我确定如果我的问题是正确的,不过,我个人会尝试这样的事情:

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

如果您愿意,有一个表名称不正确或值无效。这也可以是一个临时表 - 取决于用法(黑名单应该是一个表,服务提供的临时无效值应该是临时表等)。

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

答案 1 :(得分:0)

听起来你只需要一个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转储到临时表中(正如你在问题中提到的那样)。

答案 2 :(得分:0)

尝试以下查询:

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