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

时间:2012-09-16 19:15:26

标签: mysql

我有这种简单的查询,它返回给定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()运行查询。)

8 个答案:

答案 0 :(得分:88)

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

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

答案 1 :(得分:18)

当您正在寻找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/,了解如何使用此方法在报告中创建标题。

答案 2 :(得分:13)

您可以包含count(id)。这将永远回归。

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

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

答案 3 :(得分:5)

您可以使用COALESCE

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

答案 4 :(得分: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(如果不返回任何内容)。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

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

SELECT id, name from table into a,b;

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

答案 7 :(得分:0)

如果您既希望始终返回值,又希望不返回null值,则可以结合使用count和cecece:

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

因为计数,将强制mysql始终返回一个值(如果没有要计数的值,则返回0),合并将强制mysql始终返回一个不为null的值