2011-06-24 11 views
11

基本的に、どのシンタックスでタイトルステートメントを達成できますか?selectステートメントで行が返されない場合は、代替のselectステートメントを実行します

If (select statement 1) returns 0 rows THEN (select statement 2) else (select statement 3) 

声明2または3 のいずれかからSQLを返す結果だから、私はこれを行う方法を探していないが、私は今のところ正確であれば要件に対応するようで見つけた何もしました。ここで

+1

strange objective。それの物理的な感覚は何ですか? – heximal

+0

どのRDBMS?あなたは純粋なSQLで、またはスクリプトの一部としてこれをしたいですか? – davek

+0

「3番目のテーブルを使用するのではなく、1番目の行が選択されていない場合は2番目の選択を使用する」という意味ですか? – gbn

答えて

17
IF EXISTS (SELECT field FROM table) 
BEGIN 
SELECT field FROM table2 
END 
ELSE 
BEGIN 
SELECT field FROM table3 
END 
0

あなたは、フィードバックの欠如のため

IF ((select count(*) from table1)= 0) 
BEGIN 
Select * from table2 
END 
ELSE 
BEGIN 
SELECT * from table3 
END 
+2

ほとんどのオプティマイザは、一致する行が1つ出現するとすぐに 'EXISTS'節の評価を終了するのに十分なほどスマートです。これは、すべての結果セットが同じ形になっています(結果が動的に変更されるためです)。いくつかのオプティマイザは、COUNT(*)と0を比較することを計画しており、すべての行を評価してカウントを計算することに気づいていません。 –

+0

合意... 0を比較したい場合は、存在はすべて意味があります!他のケースでは数が役に立つかもしれません。 – Gans

1

は申し訳ありません...行きます。オフィスの他の人が興味を持ってこれを考え出した:

select * from (
     select * 
       , (SELECT Count(*) 
        FROM users 
        WHERE version_replace = 59 AND moderated = 1) AS Counter 
      FROM users WHERE version_replace = 59 AND moderated in (0,1) 
    ) AS y 
where Counter = 0 and Moderated = 0 
    or Counter > 0 and Moderated = 1 
ORDER By ID DESC 

私は何が必要なのか。

+0

少し複雑に見えますが、要件に合っています... – ChrisBint

関連する問題