【问题标题】:Postgres, replace all integer values with NULLPostgres,用 NULL 替换所有整数值
【发布时间】:2021-03-24 09:11:00
【问题描述】:

我正在尝试用 NULL 替换值为 0 的列中的所有值

SELECT score
REPLACE(score, 0, ISNULL)
FROM kpis
WHERE score=0

SELECT score
REPLACE(score, 0, ISNULL)
FROM kpis

但我得到一个语法错误:

ERROR:  syntax error at or near "REPLACE"
LINE 2: REPLACE(score, 0, ISNULL)

【问题讨论】:

  • 改用case 表达式。 (另外,REPLACE 用于字符串,而不是整数。)
  • 我不清楚您是否只想在 SELECT 中返回 NULL,或者永久更改表中的值(即运行 UPDATE)

标签: sql postgresql sql-function


【解决方案1】:

您可以使用nullif(),它在功能上等同于 CASE 表达式,但写起来要短一些。

SELECT nullif(score, 0) as score
FROM kpis

【讨论】:

    【解决方案2】:

    将值为 0 的列中的所有值替换为 NULL

    update kpis set score = NULL where score = 0;
    

    将列中的所有整数值替换为 NULL

    update kpis set score = NULL where score ~ '^[0-9]*$'
    

    【讨论】:

      【解决方案3】:

      用例当

      SELECT 
      case when score = 0 then null else score end as score
      from kpis 
      

      【讨论】:

        【解决方案4】:

        您可以使用 NULLIF() 代替替换。当分数为 0 时,下面的查询将设置 score=null。

        update kpis set score=NULLIF(score, 0)
        

        或者您可以按照@Sas 的建议简单地使用以下查询。

        update kpis set score = NULL where score = 0;

        【讨论】:

        • 这是错误的。 coalesce() 返回第一个非空值,因此您的表达式将始终返回分数或 0 - 但绝不会返回 NULL
        • 你是绝对正确的。我已经改变了我的答案。非常感谢。
        • 请注意,这将更新整个表格,即使您没有更改分数。更好的是在其他答案之一中应用 WHERE 子句,此时您不需要 NULLIF。
        猜你喜欢
        • 1970-01-01
        • 2018-10-29
        • 2021-12-10
        • 2022-12-11
        • 1970-01-01
        • 1970-01-01
        • 2017-07-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多