ISNULL两次用于同一列

时间:2013-08-20 19:45:17

标签: sql-server isnull

是否可以在同一列中使用两次ISNULL?

ISNULL(ISNULL(column, SELECT sum(column2) FROM table WHERE type = '1')), SELECT sum(column2) FROM table WHERE type = '2'))

或者我应该以某种方式与IF ELSE以不同的方式这样做?这看起来怎么样?

3 个答案:

答案 0 :(得分:2)

查看coalesce operator。您的查询将变为:

COALESCE(column, 
    (SELECT sum(column2) FROM table WHERE type = '1'), 
    (SELECT sum(column2) FROM table WHERE type = '2'))

它从其参数返回第一个非null结果。

答案 1 :(得分:1)

是的,这是可能的。

(我在问题中用表达式看到的问题是不平衡的问题;两个额外的关闭问题)

ISNULL函数有两个参数。这些参数中的任何一个(或两个)都可以是表达式,而ISNULL函数是表达式。所以,是的,您可以根据需要将ISNULL函数嵌套两个,三个,四个或更多级别。

返回包含单个列的单个行的SELECT语句可以(通常)用作表达式。查询中的多个SELECT语句(子查询)可以引用相同的表和相同的列。

在许多情况下,当我们看到这种类型的查询时,它指向一个效果不佳的模型,或指向查看获得等效结果的不同方式。

修改

正如其他答案所指出的那样,可以使用更具可移植性,符合ANSI标准的COALESCE函数来返回等效结果。

这三个表达式是等价的:

ISNULL(ISNULL(a,b),c) 
ISNULL(a,ISNULL(b,c)) 
COALESCE(a,b,c)

也等同于这些(不必要的冗余)表达式:

COALESCE(COALESCE(a,b),c)
COALESCE(a,(COALESCE(b,c))

测试用例:

create table tst (id int, a int, b int, c int);
insert into tst values 
(1,NULL,NULL,NULL)
,(2,21,NULL,NULL)
,(3,NULL,32,NULL)
,(4,NULL,NULL,43)
,(5,51,52,NULL)
,(6,61,NULL,63)
,(7,NULL,72,73)
,(8,81,82,83);

-- SQL Server
SELECT ISNULL(ISNULL(a,b),c) AS t1 
     , ISNULL(a,ISNULL(b,c)) AS t2
     , COALESCE(a,b,c)       AS t3
  FROM tst
 ORDER BY id

-- MySQL
SELECT IFNULL(IFNULL(a,b),c) AS t1 
     , IFNULL(a,IFNULL(b,c)) AS t2
     , COALESCE(a,b,c)       AS t3
  FROM tst
 ORDER BY id

-- Oracle
SELECT NVL(NVL(a,b),c)       AS t1 
     , NVL(a,NVL(b,c))       AS t2
     , COALESCE(a,b,c)       AS t3
  FROM tst
 ORDER BY id

答案 2 :(得分:0)

尝试使用COALESCE(如果您使用的是SQL Server)。 http://msdn.microsoft.com/en-us/library/ms190349.aspx

它将为您提供值列表中的第一个非空值。您是否还需要更多帮助构建SQL?