【问题标题】:What is the PostgreSQL equivalent for ISNULL()ISNULL() 的 PostgreSQL 等价物是什么
【发布时间】:2011-01-13 22:41:25
【问题描述】:

在 MS SQL-Server 中,我可以做到:

SELECT ISNULL(Field,'Empty') from Table

但在 PostgreSQL 中我得到一个语法错误。如何模拟ISNULL() 功能?

【问题讨论】:

  • 不,你不能在 MSSQL 中这样做。该代码将无法编译。 ISNULL 接受两个参数并返回第二个是第一个是null,否则是第一个。
  • @GSerg,你是对的。解决了这个问题。
  • Gserg 和 Byron 是的,你可以在这里看到 Example from my PC SELECT isnull(a.FechaEntregada,'') as test from dbo.Amonestacion a msdn.microsoft.com/en-us/library/ms184325.aspx

标签: sql-server postgresql null


【解决方案1】:
SELECT CASE WHEN field IS NULL THEN 'Empty' ELSE field END AS field_alias

或者更惯用的:

SELECT coalesce(field, 'Empty') AS field_alias

【讨论】:

  • +1 表示coalesce。 (P.S. 你也可以在 MS SQL Server 中做到这一点。)
  • 虽然还有其他使用 IS NULL 的情况,所以最好同时了解这两种情况。
  • 我认为值得注意的是coalesce是SQL标准,isnull是一个MS特定的函数,本质上是coalesce,只有两个参数。
  • Coalesce() 还可以正确处理类型提升(与 UNION SELECT 完全一样),而 IsNull() 则不能。
  • 值得指出的是,ISNULL 和 COALESCE 是不一样的。 IsNull 将结果类型强制为 argument1 的类型,而 coalesce 为每个参数使用各自的类型。如果你只是用 coalesce 搜索和替换 isnull,你可能会得到很多错误......
【解决方案2】:

创建以下函数

CREATE OR REPLACE FUNCTION isnull(text, text) RETURNS text AS 'SELECT (CASE (SELECT $1 "
    "is null) WHEN true THEN $2 ELSE $1 END) AS RESULT' LANGUAGE 'sql'

它会起作用的。

您可以创建具有不同参数类型的不同版本。

【讨论】:

  • 拜托,没有人这样做。请改用 coalesce(),这样您的 DBA 就不会讨厌您了。
  • postgres 请添加 isnull 所以没有人讨厌任何人。
【解决方案3】:

改用COALESCE()

SELECT COALESCE(Field,'Empty') from Table;

它的功能很像ISNULL,但提供了更多功能。 Coalesce 将返回列表中的第一个非空值。因此:

SELECT COALESCE(null, null, 5); 

返回 5,而

SELECT COALESCE(null, 2, 5);

返回 2

Coalesce 将采用大量参数。没有记录的最大值。我对它进行了 100 个参数的测试,它成功了。对于绝大多数情况,这应该足够了。

【讨论】:

    【解决方案4】:

    如何模拟 ISNULL() 功能?

    SELECT (Field IS NULL) FROM ...
    

    【讨论】:

    • 这模拟了 isnull 的确切功能,不知道为什么它被否决
    • 当然是这个问题的最佳答案。此表达式完全等效于 ISNULL()。 COALESCE() 非常聪明且有趣,但它在关闭时无法执行 ISNULL()。
    • 我不知道ISNULL你们评论者指的是什么,但field IS NULL给出一个布尔值,而SQL Server中的ISNULL的操作类似于COALESCE:它返回一个非NULL 值。这个答案大错特错。请参阅文档:ISNULL
    • 我怀疑这些评论者是 MySQL 用户,他们没有意识到问题的开头是“在 MS SQL Server 中,...” MySQL 有一个 ISNULL() 函数,它接受一个参数并返回 0或 1. T-SQL 的版本有两个参数,其行为类似于 COALESCE 或 Oracle 的 NVL。
    • greatvovan,无论这是否是原始海报的意图,我相信人们想要的是“我如何检查一个字段是否为空”的答案,而不一定是“究竟如何ISNULL 函数工作”。我就是这种情况,这个答案非常适合。
    【解决方案5】:

    试试:

    SELECT COALESCE(NULLIF(field, ''), another_field) FROM table_name
    

    【讨论】:

    • 这很好,因为它涵盖了文本字段不为空但也为“空”的情况。
    猜你喜欢
    • 2013-06-02
    • 2010-12-27
    • 2016-06-05
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    • 2011-10-12
    • 2022-08-16
    相关资源
    最近更新 更多