即使没有结果也返回值

我有这样一个简单的查询,它为给定的 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 ()运行查询)。

169817 次浏览

您可以包含 count (id)。它将始终返回。

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

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

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

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

SELECT IFNULL( (SELECT field1 FROM table WHERE id = 123 LIMIT 1) ,'not found');

你可以使用 COALESCE

SELECT COALESCE(SUM(column),0)
FROM   table

当您正在寻找1记录,(限制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/了解如何使用这种方法在报表中创建标题。

K-a-f 的答案适用于选择一列,如果选择多列,则可以。

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


SELECT id, name from table into a,b;

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

如果你总是想要一个返回值,而不是一个空值,你可以结合使用 count:

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

因为 count,将强制 mysql 总是返回一个值(如果没有值可以计数,则返回0) ,并且聚合将强制 mysql 总是放入一个非 null 的值

如果有人希望使用这个函数将结果插入到一个变量中,然后在存储过程中使用它,您可以这样做:

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 _ create’1或0中(如果没有返回任何内容)。