2013-02-28 86 views
3

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

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

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

回答

12

IS关键字用在something IS NULL中,而不是IN关键字。这就是为什么数据库认为存在NULL缺失的原因。只是删除IS

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

哦,上帝,你是对的。我完全有一个脑袋。 – Keen 2013-02-28 19:24:23

2

我不知道这是否会在甲骨文,但值得一试的工作:

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 '%-%'