没有找到行时返回SQL中的默认值

时间:2016-05-28 12:22:36

标签: mysql sql oracle

如果没有找到行,如何更改我的SQL以返回默认值?

例如:

select text,name from text_file where text='met'

如果找不到任何行,我希望文字包含“未找到值”和“#39;例如

4 个答案:

答案 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)
*/