68

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

SELECT field1 FROM table WHERE id = 123 LIMIT 1;

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

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

SELECT IF(EXISTS(SELECT 1 FROM table WHERE id = 123) = 1, (SELECT field1 FROM table WHERE id = 123 LIMIT 1), 0);

如果该行存在,则返回 field1,否则返回 0。有什么方法可以改进吗?

谢谢!

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

4

8 回答 8

137

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

SELECT IFNULL( (SELECT field1 FROM table WHERE id = 123 LIMIT 1) ,'not found');
于 2012-09-16T20:12:04.140 回答
35

当您正在寻找 1 条记录时,(LIMIT 1) 那么这将起作用。

(SELECT field1 FROM table WHERE id = 123) 
UNION 
(SELECT 'default_value_if_no_record')
LIMIT 1;

可以是显示默认值或指示未找到结果的便捷方式。我用它来做报告。

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

于 2016-02-23T11:10:44.830 回答
19

您可以包括计数(id)。那总会回来的。

select count(field1), field1 from table where id = 123 limit 1;

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

于 2012-09-16T19:24:31.720 回答
8

您可以使用COALESCE

SELECT COALESCE(SUM(column),0)
FROM   table
于 2016-02-08T10:54:16.107 回答
1

如果有人希望使用它来将结果插入到变量中,然后在存储过程中使用它;你可以这样做:

DECLARE date_created INT DEFAULT 1;
SELECT IFNULL((SELECT date FROM monthly_comission WHERE date = date_new_month LIMIT 1), 0) 
INTO date_created 
WHERE IFNULL((SELECT date FROM monthly_comission WHERE date = date_new_month LIMIT 1), 0) = 0;

有了这个,您将存储在变量 'date_created' 1 或 0 中(如果没有返回任何内容)。

于 2021-05-22T06:11:49.043 回答
0

用 搜索LEFT OUTER JOIN。我不知道 MySQL 是否允许VALUES在连接子句中内联,但您可以为此目的使用预定义的表。

于 2012-09-16T19:26:45.263 回答
0

kaf 的答案适用于选择一列,如果选择多列,我们可以。

DECLARE a BIGINT DEFAULT 1;
DECLARE b BIGINT DEFAULT "name";

SELECT id, name from table into a,b;

然后我们只需要检查 a,b 的值。

于 2019-05-21T01:48:17.520 回答
0

如果您希望两者始终返回值但从不为空值,则可以将 count 与 coalesce 结合使用:

select count(field1), coalesce(field1,'any_other_default_value') from table;

因为 count,将强制 mysql 始终返回一个值(如果没有要计数的值,则为 0),并且 coalesce 将强制 mysql 始终放置一个不为空的值

于 2020-07-23T13:42:01.853 回答