如果没有找到行,如何更改我的SQL以返回默认值?
例如:
select text,name from text_file where text='met'
如果找不到任何行,我希望文字包含“未找到值”和“#39;例如
答案 0 :(得分:1)
一种方法使用union all
:
select text, name
from text_file
where text = 'met'
union all
select max('Values not found'), NULL
from text_file
where text = 'met'
having count(*) = 0;
注记。第二个子查询是聚合查询。它总是返回一行(没有having
)。这一行有你想要的东西。
其次,这种类型的操作应该在应用程序中完成,而不是在数据库中完成。
第三,如果您只期望一行,那么您可以使用聚合查询,例如:
select (case when count(*) > 0 then text else 'Values not found' end) as text,
(case when count(*) > 0 then name end) as name
from text_file
where text = 'met'
答案 1 :(得分:0)
IF Exists (select * from text_file where text='met')
Begin
Select text,name From text_file Where text='met'
End
Else
Begin
Select 'Values not found'
End
答案 2 :(得分:0)
像交叉连接一样使用的全外连接(1 = 1)给出了请求的结果。
Oracle版本:
select nvl(tf.text, er.text) as text,
tf.name
from
(select 'Values not found' text from dual ) er
full outer join
text_file tf
on 1 =1
与其他解决方案一样,无需多次分组或执行查询。
答案 3 :(得分:0)
根据@dcieslak的回答,这是我在PostgreSQL中的MWE。
create table text_file (name varchar(100), text varchar(100));
select
coalesce(tf.name, default_value.name) as name,
coalesce(tf.text, default_value.text) as text
from text_file tf right outer join
(select 'Default name' as name, 'Values not found' as text) default_value
on tf.name = 'met' ;
insert into text_file values ('met', 'met text'), ('foo', 'bar');
-- execute query here
/*
name | text
------+----------
met | met text
(1 row)
*/
delete from text_file where name = 'met';
-- execute query here
/*
name | text
--------------+------------------
Default name | Values not found
(1 row)
*/