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