即使没有结果也返回一个值

Max*_*val 53 mysql

我有这种简单的查询,它返回给定id的非空整数字段:

SELECT field1 FROM table WHERE id = 123 LIMIT 1;
Run Code Online (Sandbox Code Playgroud)

问题是如果找不到id,则结果集为空.我需要查询始终返回一个值,即使没有结果.

我有这个东西工作,但我不喜欢它,因为它运行2次相同的子查询:

SELECT IF(EXISTS(SELECT 1 FROM table WHERE id = 123) = 1, (SELECT field1 FROM table WHERE id = 123 LIMIT 1), 0);
Run Code Online (Sandbox Code Playgroud)

如果行存在,则返回field1,否则返回0.是否可以改进?

谢谢!

编辑以下一些注释和答案:是的,它必须在单个查询语句中,我不能使用计数技巧,因为我只需要返回1个值(仅供参考我使用Java/Spring方法运行查询SimpleJdbcTemplate.queryForLong() ).

K.A*_*.F. 95

MySQL有一个函数,如果结果为null,则返回一个值.您可以在整个查询中使用它:

SELECT IFNULL( (SELECT field1 FROM table WHERE id = 123 LIMIT 1) ,'not found');
Run Code Online (Sandbox Code Playgroud)

  • 对于这个经常被问到的问题,这是SO的最佳答案.旁注,`COALESCE()`也可以代替`IFNULL()`.不确定是否存在性能差异,但我习惯于`COALESCE()`因此更容易记住. (3认同)
  • 将整个查询放入IFNULL的好习惯!实际上,我尝试过类似的操作:从表WHERE id = 123 LIMIT 1中选择IFNULL(field1,0);但是它没有用(没有结果),我没有想到将整个查询放入IFNULL ... (2认同)

Mar*_*ood 20

当你正在寻找1条记录(LIMIT 1)时,这将有效.

(SELECT field1 FROM table WHERE id = 123) 
UNION 
(SELECT 'default_value_if_no_record')
LIMIT 1;
Run Code Online (Sandbox Code Playgroud)

可以是显示默认值或指示未找到结果的方便方法.我用它来报道.

另请参阅http://blogs.uoregon.edu/developments/2011/03/31/add-a-header-row-to-mysql-query-results/,了解如何使用此方法在报告中创建标头.

  • 是的,这是一篇很老的帖子,但想提一下 `union` 不保证任何顺序,因此返回的 1 条目完全有可能是默认行而不是结果。我不知道有任何实现实际上会改变这个简单的结果集,但依赖这种行为确实不安全。[doc page](https://dev.mysql.com/doc/refman/5.7/en/union.html) 提到了这一点,并给出了一个涉及虚拟排序列的解决方案,如果你真的想使用这种方法,但它开始变得有点乱。 (3认同)

And*_*and 14

你可以包括count(id).那将永远回归.

select count(field1), field1 from table where id = 123 limit 1;
Run Code Online (Sandbox Code Playgroud)

http://sqlfiddle.com/#!2/64c76/4

  • 不能使用GROUP by这个. (2认同)

Nik*_* K. 6

你可以使用COALESCE

SELECT COALESCE(SUM(column),0)
FROM   table
Run Code Online (Sandbox Code Playgroud)