是否可以对同一列使用 ISNULL 两次?
ISNULL(ISNULL(column, SELECT sum(column2) FROM table WHERE type = '1')), SELECT sum(column2) FROM table WHERE type = '2'))
或者我应该以某种方式使用 IF ELSE 以不同的方式执行此操作?那会是什么样子?
是否可以对同一列使用 ISNULL 两次?
ISNULL(ISNULL(column, SELECT sum(column2) FROM table WHERE type = '1')), SELECT sum(column2) FROM table WHERE type = '2'))
或者我应该以某种方式使用 IF ELSE 以不同的方式执行此操作?那会是什么样子?
看coalesce
运营商。然后您的查询变为:
COALESCE(column,
(SELECT sum(column2) FROM table WHERE type = '1'),
(SELECT sum(column2) FROM table WHERE type = '2'))
它从其参数返回第一个非空结果。
对的,这是可能的。
(我在问题中看到的问题是不平衡的括号;两个额外的结束括号)
该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
尝试使用 COALESCE(如果您使用的是 SQL Server)。http://msdn.microsoft.com/en-us/library/ms190349.aspx
它将为您提供值列表中的第一个非空值。您还需要更多帮助来构建 SQL 吗?