MySQL - SELECT 返回模糊的空值

Posted

技术标签:

【中文标题】MySQL - SELECT 返回模糊的空值【英文标题】:MySQL - SELECT Returns Vague Null Value 【发布时间】:2016-03-14 11:00:26 【问题描述】:

请看一下查询:

 SELECT Id
   FROM TableA
  WHERE ColumnA = 'foo'
  ORDER BY Id DESC
  LIMIT 1

基本上,我希望查询获取 TableA 上的最新条目(列 IdAI )并声明条件 ColumnA = 'foo'.

查询将顺利运行并返回我需要的内容。如果没有匹配条件 ColumnA = 'foo' 的表条目,则结果为 null

话虽如此,我添加了一个 CASE 来代替返回 1ELSE,返回 Id。以下是新查询:

 SELECT CASE
            WHEN Id IS NULL
            THEN 1
            ELSE Id
        END
   FROM TableA
  WHERE ColumnA = 'foo'
  ORDER BY Id DESC
  LIMIT 1

使用给定的查询,如果条件为假,则不会有任何结果。它是空白的。甚至不是 NULL。

问题是,为什么会这样?在我看来,结果应该是 1

这是一个用于测试的 Fiddle 链接:http://sqlfiddle.com/#!9/a8e3af/3

注意: 如果我使用 MAX 而不是将结果限制为 1,这将起作用。我只是想知道为什么这个解决方案不起作用。

【问题讨论】:

如果没有匹配的行,使用第一个查询的结果也不应该为空。它应该是一个空的结果集。 【参考方案1】:

ID 永远不会为空,因为没有返回任何行,并且永远不会执行 CASE WHEN。解决方法如下:

SELECT COALESCE(MAX(ID), 1) AS ID
FROM (
  SELECT  ID
  FROM TableA
  WHERE ColumnA = 'G'
  ORDER BY Id DESC
  LIMIT 1
) s

(聚合查询将始终返回一行,如果返回 ID,则返回 MAX(ID),如果子查询未返回任何行,则返回 null)

【讨论】:

我明白了。这就是 CASE WHEN MAX(Id) IS NULL THEN 1 ELSE MAX(Id) END 在条件返回 false 时返回 1 的原因【参考方案2】:

你可以试试这个可能对你有用

SELECT IFNULL(Id,1) as ID
FROM TableA
WHERE ColumnA = 'foo'
ORDER BY Id DESC
LIMIT 1

【讨论】:

谢谢阿什。我正在寻找为什么给定的查询没有返回任何问题而不是解决方法。无论如何,谢谢你的时间。 +1

以上是关于MySQL - SELECT 返回模糊的空值的主要内容,如果未能解决你的问题,请参考以下文章

使用mysql中的select语句替换sql中的空值?

mysql中的空值问题

在存储在 hdfs 中的 orc 文件上创建外部表后,select * 返回时间戳的空值

antdesign中可以用select组件实现对表单的搜索吗?

如何写sql语句去掉oracle返回结果中的空值(NULL)

检查 MS Access SQL 语句中的空值