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 行错误,靠近字符位置 57DECODE
运行良好,但您尝试提供的日期是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