2012-08-17 59 views
2

我正在解决这个问题好几天。我有一个oracle数据库。 该问题必须在中解决一个查询。 No Function,Pocedure,... 我想做一个选择。当他有结果时,张贴他们。否则应该有“空洞的结果”。SQL 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函数。所以如果结果不是“没有输入”,我只能得到一个值。我需要所有的价值。

每个能够帮助我的人都欢迎并且让我开心。

+0

查询的期望输出是什么?做一个例子。 – schurik 2012-08-17 10:23:23

+0

你说:“当他有结果时,张贴他们”。这些结果是否有多个列?如果是这样,你所要求的是不可能的。查询总是返回一定数量的列。这些不能根据查询本身的某些条件进行更改。 – 2012-08-17 10:30:28

回答

3

不知道你怎么努力实现,也许这

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

谢谢,作品太棒了! – 2012-08-20 05:25:07

2

不需要两个聚合查询,你只需要检查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') 
-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; 
+0

嗨,您可以使用代码格式化,突出显示代码的相关部分并点击'{}'。 OP特别要求SQL而不是PL/SQL。此外,你的代码不会编译或显示任何东西。它不会返回任何东西给客户端。你的代码的第二部分不是Oracle语法。 – Ben 2012-08-17 12:55:29

1

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

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 
    ); 
0

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

SELECT MIN( '值1')为P1,MIN(” VALUE 2')AS p2 FROM DUAL WHERE 1 = 0

此查询结果是: NULL,NULL

接下来,需要的字符串替换为空值:

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 

,你不能在混合领域的数字和字符串。