1

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

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

或者我应该以某种方式使用 IF ELSE 以不同的方式执行此操作?那会是什么样子?

4

3 回答 3

2

coalesce运营商。然后您的查询变为:

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

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

于 2013-08-20T19:50:51.717 回答
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
于 2013-08-20T20:02:15.750 回答
0

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

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

于 2013-08-20T19:52:43.223 回答