如果一列为 Null,则 SQL 返回 Null(与 COALESCE() 相反)

Posted

技术标签:

【中文标题】如果一列为 Null,则 SQL 返回 Null(与 COALESCE() 相反)【英文标题】:SQL Return Null if One Column is Null (Opposite of COALESCE()) 【发布时间】:2011-05-11 12:08:21 【问题描述】:

在此先感谢您的帮助。这是一个很棒的社区,我在这里找到了很多编程答案。

我有一个包含多列的表,其中 5 列包含日期或空值。

我想编写一个 sql 查询,基本上将 5 列合并为 1 列,条件是如果 5 列中的 1 列包含“NULL”值,则返回值为 null。本质上与返回第一个非空值的合并条件相反,我想返回第一个空值。如果没有一个为空,返回 5 个日期中最大的一个将是最佳的,但是我可以选择返回 5 个日期中的任何一个。

    C1         C2          C3        C4        C5
    --         --          --        --        --
 1/1/1991   1/1/1991    1/1/1991  1/1/1991  2/2/1992
   NULL     1/1/1991    1/1/1991  1/1/1991  1/1/1991

查询返回:

    C1
    --
 2/2/1992
   NULL

非常感谢。

(服务器为MSSQL2008)

【问题讨论】:

这可能会让你更容易知道任何包含NULL的集合的总和也是NULL... 你使用的是什么数据库服务器? 我猜你会得到从 Oracle 到 SQL Server 的各种答案,直到你告诉我们你正在使用什么数据库系统。与 Oracle 合作最多和最少。我的解决方案应该适用于两者。 这已经很晚了,但可能对像我一样从 Google 来到这里的任何人都有用。作为对@JNK的响应,至少在SQL Server R2中,只要集合中至少有一个非NULL值,NULL就不会影响集合的SUM。例如,SELECT SUM(val) sum_of_value FROM ( SELECT 4 val UNION ALL SELECT 5 UNION ALL SELECT NULL ) test 为我返回 9,而不是 NULL。 @pcronin 抱歉,总和是指内联加法,而不是 SUM() 聚合函数。 SELECT 1+1+1+NULL 【参考方案1】:
select greatest(c1, c2, c3, c4, c5)
from table;

生活可以如此简单:-)

(编辑:适用于 Oracle)

【讨论】:

【参考方案2】:

不要想太多:

SELECT
  CASE WHEN c1 is null or c2 is null or c3 is null or c4 is null or c5 is null
       THEN null
       ELSE c1
  END
FROM mytable

我的编辑如下:

CASE 
 WHEN (c1 >= c2 AND c1 >= c3) THEN c1
 WHEN (c2 >= c1 AND c2 >= c3) THEN c2
 WHEN (c3 >= c1 AND c3 >= c2) THEN c3
END

【讨论】:

这是我所需要的基本要素。非常感谢大家,真诚的。作为一个从网络上学习 SQL 的人,很高兴有一个资源可以将自己与比我更了解 WAAAAY 的人联系起来。我不知道是否有内置函数,或者我是否必须使用 case 语句. 如果所有五个都不为空,则不会返回 5 个中的最大值。 OP 表明他愿意接受退回其中任何一个。 感谢所有帮助。我知道这个评论已经过期了,但这个问题的真正答案与提供的这个解决方案属于同一类。【参考方案3】:

试试这个:

SELECT
    CASE WHEN t1.SomeDate IS NULL THEN NULL ELSE MAX(t1.SomeDate) END AS TheVal
FROM
(
SELECT C1 AS SomeDate FROM Table_1
UNION ALL
SELECT C2 AS SomeDate  FROM Table_1
UNION ALL
SELECT C3 AS SomeDate FROM Table_1
UNION ALL
SELECT C4 AS SomeDate FROM Table_1
UNION ALL
SELECT C5 AS SomeDate FROM Table_1
) t1
GROUP BY
t1.SomeDate

【讨论】:

当您对 OP 的数据运行查询时,您的输出是什么?你得到两条还是三条记录? 运行您的查询时,我得到 3 条记录,NULL、1991 和 1992。您确定您使用的是正确的数据集吗? 好的,第一条评论不准确,我删除了。 @JonH 当您将所有列粉碎成带有 union all 的行时,不能保证您的解决方案将为每个原始记录产生 1 个结果。将原始数据更改为具有 9 个不同的日期和一个空值。然后,您的查询返回 10 个结果而不是 2 个。这解释了我对您的解决方案的反对意见。【参考方案4】:

可能是合并的变体(将 -1 替换为无效值)?

当 COALESCE(C1,C2,C3,C4,C5,-1) = -1 THEN NULL ELSE COALESCE(C1,C2,C3,C4,C5) END 时选择 CASE

【讨论】:

【参考方案5】:

也许是LEAST? 我不知道这如何与 NULL 一起使用。

【讨论】:

【参考方案6】:
SELECT 
    CASE WHEN C1 IS NULL THEN C2 WHEN C1 IS NULL AND C2 IS NULL THEN C3 WHEN C1 IS NULL AND C2 IS NULL AND C3 IS NULL THEN C4 WHEN C1 IS NULL AND C2 IS NULL AND C3 IS NULL AND C4 IS NULL THEN C5 ELSE C1 END AS REQUIREDNOTNULLVALUE 
FROM 
TABLE1

【讨论】:

以上是关于如果一列为 Null,则 SQL 返回 Null(与 COALESCE() 相反)的主要内容,如果未能解决你的问题,请参考以下文章

java-ConcurrentLinkedQueue 简单使用

如果另一列为空,则选择一列

MySQL的Null值

sql

SQL 在 select 子查询中只返回一行或 null

sql中如何去除值为null的列