SQL nvl 等效 - 没有 if/case 语句 & isnull & coalesce

Posted

技术标签:

【中文标题】SQL nvl 等效 - 没有 if/case 语句 & isnull & coalesce【英文标题】:SQL nvl equivalent - without if/case statements & isnull & coalesce 【发布时间】:2009-01-16 16:37:52 【问题描述】:

SQL中有nvl()等价函数吗?

或者在某些场景中以相同方式使用的足够接近的东西?


更新: 没有 if 语句没有 case 语句没有 isnull没有合并
select nvl (purge_date,"SODIUFOSDIUFSDOIFUDSF") from id_rec where id=36581;


(expression)

SODIUFOSDIUFSDOIFUDSF

1 row(s) retrieved.

select isnull (purge_date,"SODIUFOSDIUFSDOIFUDSF") from id_rec where id=36581;

  674: Routine (isnull) can not be resolved.
Error in line 1
Near character position 8

select coalesce (purge_date,"SODIUFOSDIUFSDOIFUDSF") from id_rec where id=36581;

  674: Routine (coalesce) can not be resolved.
Error in line 1
Near character position 8

select decode(purge_date, NULL, "01/01/2009", purge_date) from id_rec where id=74115;

  800: Corresponding types must be compatible in CASE expression.
Error in line 1
Near character position 57

【问题讨论】:

您使用的确切版本会有所帮助。另外,如果 nvl 有效,为什么不使用它呢? 我不确定如何找出我正在使用的版本。它的 informix 和旧版本...对于一种情况,nvl 不起作用,我不知道为什么 NVL 导致问题的场景是什么? 我的一张表中有一个字段为“null”(“”或“”),它应该是某人的名字。我们为一般用途设置了一个键,从未输入名称。它最终击中了粉丝,我不得不修复它,但 NVL 没有这样做,我不得不用一堆 BS 解决它 不要忘记,与其他一些系统不同,Informix 不会将空字符串视为 NULL——两者是不同的。运行带有“-V”选项的 Informix 程序应该会打印一些版本信息。您选择的程序名称也可能有所帮助。 【参考方案1】:

ISNULL(用于单个替换)

COALESCE(返回其参数中的第一个非空表达式。)

【讨论】:

我正在使用 Sybase 12.5。 DECODE 和 NVL 均不可用,但 ISNULL 效果很好。【参考方案2】:

SQL 服务器: IsNull 或 COALESCE http://msdn.microsoft.com/en-us/library/ms184325.aspx

赛贝斯: isnull 函数 http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.help.ase_15.0.blocks/html/blocks/blocks162.htm

Postgres: 虽然没有完全检查,但我找不到。建议选择 where IS NULL 并从这里构建 http://archives.postgresql.org/pgsql-sql/1998-06/msg00142.php

DB2 - 合并 http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/admin/r0000780.htm

【讨论】:

【参考方案3】:

您似乎在使用 Informix。

AFAIK,那里有 DECODE:

DECODE(field, NULL, 'it is null, man', field) 应该给你与NVL(field, 'it is null, man') 相同的结果

请发布您正在使用的 RDBMS 的确切名称和版本。

【讨论】:

是的,旧的 informix .. 不知道是什么版本... 我从那个语法中得到了这个错误 select decode(purge_date, NULL, "01/01/2009", purge_date) from id_rec where id= 74115; 800:对应的类型必须在 CASE 表达式中兼容。第 1 行错误,靠近字符位置 57 DECODE 运行良好,但您尝试提供的日期是string,或者通过隐式转换我猜它是datetime year to second 或任何默认值。所以使用DECODE(purge_date, NULL, EXTEND('01/01/2009', year to day), purge_date) from id_rec 转换为purge_date 的格式。 (刚刚注意到,@RET 的回答中也有相同的解释)【参考方案4】:

产生 800 错误的 DECODE 语句的问题很简单。 '01/01/2009' 被视为字符串,实际上是第 4 个参数产生错误。

了解 DECODE 语句的输入和输出可以是不同的数据类型,因此引擎要求您在这种情况下更加明确。 (您是要将purge_date 转换为字符串还是字符串'01/01/2009',还是将字符串参数解析为日期或原始日期?引擎无法知道。

试试这个:

SELECT DECODE(purge_date, NULL, '01/01/2009'::DATE, purge_date)

你也可以把第三个参数写成:

    DATE('01/01/2009')
    MDY(1,1,2009)

取决于版本和个人喜好。

【讨论】:

以上是关于SQL nvl 等效 - 没有 if/case 语句 & isnull & coalesce的主要内容,如果未能解决你的问题,请参考以下文章

SQLite 等效于 ISNULL()、NVL()、IFNULL() 或 COALESCE()

postgreSQL计算总数sum if case when

SQL:WHERE 子句中的 IF/CASE 语句

sql语句if,case when

SQL条件语句(IF, CASE WHEN, IF NULL)

PL/SQL NVL 和 OracleParameter 在 C# 中不起作用