2011-08-01 110 views
0

我有下面的場景(下表),我想根據它們是否爲NULL來選擇'X'或'Y'。Oracle UNION ALL在查詢中保留記錄的順序

X   Y   pick 
    null  not null  Y 
    not null not null  X 
    not null null   X 

包含數據的 'X' 和 'Y' 或UNION行ALLed象下面這樣:

select 'X' as a 
    union all 
    select 'Y' as a 

所以,我想,得到了下面的SQL,但不知道的「ROWNUM < = 1 「部分。如果UNION ALL保留 我查詢兩行的順序,這將起作用(對於X和Y都不爲空的情況)。

select a from 
    (
    select 'X' as a 
    union all 
    select 'Y' as a 
) where a is not null and rownum<=1; 

    select a from 
    (
    select null as a 
    union all 
    select 'Y' as a 
) where a is not null and rownum<=1; 

    select a from 
    (
    select 'X' as a 
    union all 
    select null as a 
) where a is not null and rownum<=1; 

是上述正確的方式去做這件事嗎?任何有識之士將不勝感激

+1

「UNION」或「UNION ALL」的結果是一個集合。集*沒有*訂單。即使你在簡單的測試中觀察到明顯的順序,你也不應該依賴這樣的命令。 –

回答

0

如果你想在SQL特定的順序,你要問它。你也許可以延長你的工會爲:

select a from (
    select a,rownum as rn from 
    (
     select 'X' as a, 0 as Priority from dual 
     union all 
     select 'Y' as a, 1 as Priority from dual 
    ) where a is not null order by Priority 
) where rn = 1 

雖然我承認我不是偉大的甲骨文。我相信rownum在WHERE條款中做了奇怪的事情,這就是爲什麼我引入了額外的查詢級別。

+0

謝謝達米安。看起來這可能會訣竅。 – komedit1

+0

兩件事情:1)你不能在Oracle中沒有'from'子句的'select'。如果你想製作一排,標準的做法是從「dual」中選擇。 2)我沒有看到這個查詢的要點:列「a」不可能是null,而'rownum'過濾器將永遠移除聯合的後半部分。剩下的就是'選擇'X'作爲一個雙重'的等價物。 – Allan

+0

@Allan - 我儘可能地模仿OP的查詢。他們有3個相同的查詢,我已經複製了第一個,但增加了我想說明的功能。我說我對甲骨文不太瞭解 –

1
+0

你能舉一個例子來說明一下嗎?我曾想過使用coalesce,但它是一個需要多個單獨值而不是多個記錄的函數。所以我不知道如何將它插入到查詢中。 – komedit1

+0

我以爲你剛開始說過你有一張有兩列X和Y的桌子。如果你不這樣做,請讓你的桌子做得更清楚。 Coalese將兩個值作爲參數,通常來自同一行的兩列值。 – Tim