是否可以在同一列中使用两次ISNULL?
ISNULL(ISNULL(column, SELECT sum(column2) FROM table WHERE type = '1')), SELECT sum(column2) FROM table WHERE type = '2'))
或者我应该以某种方式与IF ELSE以不同的方式这样做?这看起来怎么样?
答案 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?