【问题标题】:Missing NULL keyword error when trying to avoid duplicates [closed]尝试避免重复时缺少 NULL 关键字错误[关闭]
【发布时间】:2013-02-28 19:16:51
【问题描述】:

我正在尝试对包含与 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 的记录。如何检测这些违反约束的记录?

【问题讨论】:

    标签: sql oracle11g


    【解决方案1】:

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

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

    【讨论】:

    • 天哪,你是对的。我在那里完全是脑残。
    【解决方案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 '%-%'
    

    【讨论】:

      猜你喜欢
      • 2010-10-08
      • 1970-01-01
      • 2013-02-02
      • 2015-04-15
      • 1970-01-01
      • 2021-04-23
      • 2020-04-03
      • 1970-01-01
      • 2016-03-12
      相关资源
      最近更新 更多