2012-08-17 68 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 

,你不能在混合領域的數字和字符串。