尝试避免重复时缺少NULL关键字错误

时间:2013-02-28 19:16:52

标签: sql oracle11g

我正在尝试对包含与Oracle 11g下的人员相关的记录的表进行更新。我有一个包含ID的列,其中一些包含连字符。该表对此ID有约束,因此两个不同的人不能拥有相同的ID。我的目标是删除连字符,同时避免在进行更新时出现任何约束违规。所以我尝试了这个查询来检测违反约束的记录:

SELECT count(*) FROM people
WHERE externalid LIKE '%-%' AND
replace(externalid, '-') IS IN (SELECT externalid FROM people);

然后失败,ORA-00908:缺少NULL关键字。我知道这是由于最后一行,但我不知道如何构造查询的那一部分以检测已经使用非连字ID的记录。如何检测违反约束条件的这些记录?

2 个答案:

答案 0 :(得分:13)

IS关键字用于something IS NULL,而不是IN关键字。这就是数据库认为缺少NULL的原因。只需删除IS

即可
SELECT count(*) FROM people
WHERE externalid LIKE '%-%' AND
replace(externalid, '-') IN (SELECT externalid FROM people);

答案 1 :(得分:2)

我不确定这是否适用于oracle但值得一试:

SELECT * FROM people p1
Inner Join people p2 on replace(p1.externalid, '-') = p2.externalid
and p1.externalid < p2.externalid --prevents duplicate matches
Where p1.externalid LIKE '%-%'