当结果为空时如何返回NULL?

24

我有一个简单的查询,只选择一个字段和一行数据,因此只有一个值。

如果查询结果为空集,是否有办法使其返回NULL?而不是返回零行?

我认为我需要使用NOT EXISTS的某些东西,然后NULL,但并不确定。


为什么你想要返回 null? - bugwheels94
@Ankit 我正在进行插入操作,其中一个列必须链接到另一个具有外键约束的表。空结果会导致FALSE,我需要NULL。 - silkfire
https://dev59.com/n2DVa4cB1Zd3GeqPifgK 这个问题的代码几乎与你所需的相同。 - exussum
5个回答

38
select
  (Your entire current Select statement goes here) as Alias
from 
  dual

dual 是一个内置表,只有一行,可以用于此类目的。在 Oracle 中,这是强制性的,直到 23c 版本。MySQL 支持它,但您也可以只选择一个值而不指定表,如下所示:

select
  (Your entire current Select statement goes here) as Alias

在任何情况下,您都选择了一个单一的值。这意味着:

  • 如果您的选择返回一个值,则返回该值。
  • 如果您的选择语句返回一列但没有行,则将返回 NULL。
  • 如果您的选择语句返回多列和/或多行,则此方法不起作用,查询失败。

太棒了!这正是我想要的。它甚至可以在没有“别名”的情况下工作! - silkfire
不需要使用别名,这取决于您如何处理结果。 :) - GolezTrol
此外,第三种情况可以通过在内部查询中使用 LIMIT 1 来解决 :) - silkfire
1
“什么是dual”这个问题还没有得到回答:Mysql没有“dual”。实际上,大多数数据库都没有它。Oracle有。我想不出其他的了。这个问题被标记为mysql。 - Bohemian
@Bohemian 好的,好的,我已经在答案中添加了解释。 :-) - GolezTrol
显示剩余2条评论

18
一个简单的方法是使用聚合:
select max(col)
from t
where <your condition here>

这个函数总是返回一行数据。如果没有匹配到结果,它会返回 NULL


似乎这返回了t表中所有列的最大值。该最大值不受where子句中条件限制。是这样吗? - Guildenstern

7
回复晚了,但我认为这是最简单的方法:
SELECT
   IFNULL((SELECT your query), NULL)

0
你可以使用 COALESCE 函数,例如:
SELECT COALESCE(Field1,NULL) AS Field1 FROM Table1
编辑 1: 抱歉,我弄错了,应该是返回结果集为空时使用 Union 和 Exist 函数,像这样:
SELECT NULL AS Field1 FROM Table1 WHERE not EXISTS(SELECT Field1 FROM Table1 WHERE Field2>0)
UNION
SELECT Field1 FROM Table1 WHERE Field2>0

如果行不存在,这仍然会返回零结果。这不是我想要的。 - silkfire
@silkfire 不好意思,我把 null 当成了字段值返回。请看 Edit1。 - Mehdi Yeganeh

0

使用带有NOT EXISTS的UNION(原始where子句)

select col1
from mytable
where <some condition>
union
select null
where not exists (
    select *  from mytable
    where <some condition>)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接