6

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

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

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

4

2 回答 2

15

IS关键字在 中使用,something IS NULL而不是与IN关键字一起使用。这就是为什么数据库认为缺少 NULL 的原因。只需删除IS

SELECT count(*) FROM people
WHERE externalid LIKE '%-%' AND
replace(externalid, '-') IN (SELECT externalid FROM people);
于 2013-02-28T19:22:49.730 回答
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 '%-%'
于 2013-02-28T19:22:59.727 回答