2011-08-01 60 views
0

NULLかどうかに基づいて、「X」または「Y」を選択したい次のシナリオ(下の表)があ​​ります。 Oracle UNION ALL問合せのレコード順序の保持

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

は、だから私は試したし、次のSQLを得たが、「ROWNUMの< = 1わからない:データ 'X' と 'Y' またはUNIONを含む

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

行は以下のようにALLed "部分。 UNION ALLが の2つの行を照会する順序を保持する場合にのみ、これは(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; 

これは正しい方法ですか。あなたはSQLで特定の順序をしたい場合は、任意の洞察力がはるかに

+1

'UNION'または' UNION ALL'の結果が集合です。セット*には注文がありません。あなたが簡単なテストで明白な順序を観察したとしても、今まで存在していたそのような命令に頼るべきではありません。 –

答えて

0

いただければ幸い、あなたはそれを聞いています。

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

Damienありがとうございます。これはトリックを行うかもしれないように見えます。 – komedit1

+0

2つのこと:1)Oracleでは 'from'節なしで' select'を発行できません。行を作成する場合、標準的な方法は 'dual'から選択することです。 2)私はこのクエリのポイントが表示されません:列 "a"はおそらくヌルにすることはできませんし、 'rownum'フィルタは常に、共用体の後半を削除します。残っているのは 'select 'X' from a dual'と同じです。 – Allan

+0

@Allan - 私は可能な限りOPのクエリを模倣していました。彼らは3つの同じクエリを持っています、私は最初に再現しましたが、私が説明したい機能を追加しました。私はオラクルとはあまり関係がないと言った –

1
+0

合体例を教えてください。私は合体の使用について考えていましたが、複数の個別の値を必要とする関数であり、複数のレコードではありません。だから私はどのようにクエリにプラグインするのか分からなかった。 – komedit1

+0

私はあなたが最初にXとYの2つの列を持つテーブルを持っていたと言ったと思いました。そうでない場合は、あなたが持っているものをもっと明確にしてください。 Coaleseは引数として2つの値、通常は同じ行の2つの列の値をとります。 – Tim

関連する問題