【问题标题】:POSTGRESQL unable to compare null columnsPOSTGRESQL 无法比较空列
【发布时间】:2016-07-25 07:13:32
【问题描述】:

以下是我的 SQL 查询:

update table 
set unit_id = T1.unit_id_temp from
       (select case when unit_id4 is not null then unit_id4
        when unit_id3 is not null then unit_id3
        when unit_id2 is not null then unit_id2
        when unit_id1 is not null then unit_id1
        else unit_id
        end as unit_id_temp,
        unit_id1,unit_id2,unit_id3,unit_id4
        from   table)  T1
where table.unit_id4  = T1.unit_id4
and   table.unit_id3  = T1.unit_id3
and   table.unit_id2  = T1.unit_id2  
and   table.unit_id1  = T1.unit_id1 

从上面的查询中,当它们为 NULL 时,我无法比较列,因为条件返回 false。

例如: 当 unit_id4 为 null 时, table.unit_id4 = T1.unit_id4 返回 False。

因此,只要任一列包含 NULL 值,我的更新就会失败。

我试过用不区分,它不起作用。抛出以下错误:

更新 - 0 行,0.000 秒] [代码:0,SQL 状态:42601] 错误:“不同”处或附近的语法错误

【问题讨论】:

    标签: postgresql amazon-redshift


    【解决方案1】:

    我认为您可以将整个查询替换为:

    UPDATE table
    SET unit_id = COALESCE(unit_id4, unit_id3, unit_id2, unit_id1)
    WHERE COALESCE(unit_id4, unit_id3, unit_id2, unit_id1) IS NOT NULL
    

    在我看来,您的逻辑是按此顺序将unit_id 列更新为unit_id4unit_id3unit_id2unit_id1,如果这些列中的任何一个不是NULLCOALESCE 函数非常适合这个用例。如果所有四列都是NULL,则UPDATE 中的逻辑是简单地将相同的值分配回unit_id。我的查询中的WHERE 子句将阻止UPDATE 甚至在所有四个单位列都是NULL 的记录上运行,因此永远不会浪费任何努力。

    【讨论】:

    • 好的,很抱歉我错过了一些信息:我正在 AWS Redshift 上尝试这个。我已经尝试过上一个查询,得到的是“:目标表必须是等值连接谓词的一部分”
    • 如果我是你,我会放弃你原来的查询,因为我认为它可以更简单地重写。
    • urghhhh., 非常感谢.. 这让我很愚蠢.. 使用 COALESCE 让我很不爽。
    猜你喜欢
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多