SQL 以任意顺序查找第一个非空值

标签 sql sql-server tsql sql-server-2008-r2

鉴于下表:

ID | Value
----------
 1 | NULL
 2 |  B
 3 |  C
 4 | NULL

我想根据不同的顺序从 Value 列中获取第一个非空值,例如:
SELECT FIRST_NON_NULL(Value ORDER BY ID) FROM MY_TABLE

这将返回 B
SELECT FIRST_NON_NULL(Value ORDER BY ID DESC) FROM MY_TABLE

这将返回 C

附言不必是值函数,只需是需要的 SELECT 语句。谢谢你。

编辑:想看看是否可以有一个可扩展的版本。
ID | Value1 | Value2
--------------------
 1 |  NULL  |   AA
 2 |   B    |  NULL
 3 |   C    |   CC
 4 |  NULL  |  NULL

SELECT FIRST_NON_NULL(Value1, Value2 ORDER BY ID) FROM MY_TABLE

这将返回 B, AA
SELECT FIRST_NON_NULL(Value1, Value2 ORDER BY ID DESC) FROM MY_TABLE

这将返回 C, CC

最佳答案

做就是了 :

SELECT TOP 1 Value
FROM mytable
WHERE Value IS NOT NULL
ORDER BY ID

要获得最后一个非空值,请切换排序:
ORDER BY ID DESC

要将相同的逻辑扩展到更多列,您可以使用以下查询:
SELECT (SELECT TOP 1 Value1 FROM mytable 
        WHERE Value1 IS NOT NULL ORDER BY ID) AS min_Value1,
       (SELECT TOP 1 Value2 FROM mytable 
        WHERE Value2 IS NOT NULL ORDER BY ID) AS min_Value2

Demo here

关于SQL 以任意顺序查找第一个非空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45206136/

相关文章:

sql - 违反唯一约束后事务仍然提交

sql - 如何将UNION查询结果移动到新表?

mysql - ORDER BY 日期在即将到来的日期之后的过去日期

python - 使用 pymssql 成功连接到 Azure 上的 MS SQL DB,执行 INSERT 语句,没有错误消息,但插入了 0 行

sql-server - 获取 child 账户

sql-server - 单个 SQL Server 命名实例上的多个数据库

sql-server - 将 XML 从一种格式转换为另一种格式

sql - 如何在 PostgreSQL 中通过数组正确创建多个条目?

mysql - 如何将这两个查询合并在一起?

mysql - SQL:达到 unix 时间时如何删除一行?