【问题标题】:SQL Oracle: Replace an empty result with wordSQL Oracle:用单词替换空结果
【发布时间】:2012-08-13 19:03:09
【问题描述】:

我已经解决这个问题好几天了。我有一个 oracle 数据库。 该问题必须在一个查询中解决。没有功能,程序,... 我想做一个选择。当他有结果时,发布它们。否则应该有“空结果”。

select case 
when count(*) = 0    
then 'no Entry'   
else MAX(Member)--all Members should be here 
END as Member 
from tableMember 
where Membergroup = 'testgroup'; 

问题是 Oracle 想要通过 else 实现 Agregat 函数。因此,如果结果不是“无条目”,我只会得到一个值。我需要所有的价值观。

欢迎任何可以帮助我的人,让我快乐。

【问题讨论】:

  • 查询的期望输出是什么?请举个例子。
  • 你说:“当他有结果时,发布它们”。这些结果是否有不止一列?如果是这样,那么您所要求的就不可能了。一个查询总是有一定数量的它返回的列。这些不能根据查询本身的某些条件而改变。

标签: sql oracle select case


【解决方案1】:

您可以使用一些聚合函数和 NVL 来实现您的目标:

SELECT MIN('VALUE 1') AS p1, MIN('VALUE 2') AS p2 FROM DUAL WHERE 1=0

这个查询的结果是: 空,空

接下来,用所需的字符串替换空值:

SELECT 
    NVL(MIN('1'), 'empty  value 1') AS p1, 
    NVL(MIN('STRING VALUE'), 'empty value 2')  AS p2,
    NVL(MIN((select 'subquery result' from dual)), 'empty subquery result') as p3
FROM 
    DUAL 
WHERE 
    1=0

但是,你不能在字段中混合数字和字符串。

【讨论】:

    【解决方案2】:

    试试这个:

    DECLARE C INTEGER;
    
    SELECT COUNT(*) INTO C FROM tableMember WHERE Membergroup = 'testgroup';
    
    IF C > 0
    
    THEN
    
        SELECT * FROM tableMember;
    
    ELSE
    
        SELECT 'No results!' FROM tableMember;
    
    END IF;
    

    【讨论】:

    • 您好,您可以通过突出显示代码的相关部分并单击{} 来使用代码格式。 OP 专门要求 SQL 而不是 PL/SQL。此外,您的代码不会编译或显示任何内容。它不会向客户端返回任何内容。您的代码的第二部分不是 Oracle 语法。
    【解决方案3】:

    如果您RIGHT JOIN 查询空集,您将始终获得一行,如果您的查询返回数据,您将获得所有行。这比使用NOT EXISTSUNIONUNION ALL 更便宜(更快),因为它不需要多次扫描数据。

    SELECT nvl(a.member,b.member) member
       FROM (SELECT member FROM tablemember WHERE membergroup='????') a
       RIGHT JOIN (SELECT 'no Entry' member FROM dual) b ON 1=1;
    

    测试环境:

    DROP TABLE tablemember;
    CREATE TABLE tablemember AS
       (
          SELECT TO_CHAR(level) member
             , DECODE(mod(level, 5), 0, 'testgroup', 'othergroup') membergroup
          FROM dual CONNECT BY level <= 50
       );
    

    【讨论】:

      【解决方案4】:

      不知道你想达到什么目的,也许是这个

       select member from tablemember where Membergroup = 'testgroup'
      union 
       select  'no Entry' 
       from dual 
       where NOT EXISTS ( select member from tablemember where membergroup = 'testgroup')
      ;
      

      【讨论】:

        【解决方案5】:

        不需要两个聚合查询,只需要检查max(member) 是否为空即可。我这样做是为了弄清楚发生了什么。

        select case when max_member is null then 'no entry' else max_member end as member
          from ( select max(member) as max_member
                   from tablemember
                  where membergroup = 'testgroup'
                        )
        

        但是,如果您想返回所有成员,您可以执行以下操作:

        select member
          from tablemember
         where membergroup = 'testgroup'
         union all
        select 'no entry'
          from dual
         where not exists ( select 1 from tablemember where membergroup = 'testgroup')
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-03-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-27
          相关资源
          最近更新 更多