我必须将逗号分隔值与表中的列进行比较,并找出数据库中没有的值。 [主数据验证的种类]。请查看以下示例数据:
数据库中的表数据:
id name
1 abc
2 def
3 ghi
SQL部分:
我在这里以逗号分隔列表('abc','def','ghi','xyz')
。
现在xyz
是无效值,所以我想取该值并将其作为输出返回“无效值”。
如果我将这些值分开,可以将它放在临时表中,循环遍历每个值并逐个进行比较。
但还有其他最佳方法吗?
答案 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