2016-08-02 16 views
6

私はフィールド 'value1'の値がない場合、フィールド 'value1' = 'default'のレコードをフェッチする必要があります。上記のクエリは、私は次のクエリを発射するレコードお返ししない場合'WHERE'句の異なる値にフォールバックする方法sql?

Select * from table_name where field1="value1"

::私は2つのクエリを使用していた上記のシナリオについては

Select * from table_name where field1="default"

を私は1つのクエリで上記を実行したい。誰かが私を同じように助けてくれますか?私は答えがCASE WHEN節を使用してどこかにあると信じています。

上記のクエリは、oracle、postgres、およびmysqlでも機能します。 MySQLの

+4

どのようなrdbmsを使用していますか? –

+0

ポストグル、mysqlとオラクル – user2713255

答えて

3

ユースケースと

Select * from table_name where field1= 
    case when exists(select 1 from table_name where field1='value1') 
    then 'value1' else 'default 'end 
0

SET @a = Select Count(*) from table_name where field1="value1" 
IF @a > 0 Then 
Select 
    * 
from 
    table_name 
where 
    field1="value1" 
ELSE 
Select 
    * 
from 
    table_name 
where 
    field1="default" 
END IF 
6

すべての異なるプラットフォーム上で実行することが予想コアANSI SQLの答えは、:

select * from table_name 
where field1 = 'value1' 
    or (field1 = 'default' 
     and NOT EXISTS (select 1 from table_name where field1 = 'value1')) 
0

オーケー以下のように存在し、私はこれを試してみるとうまくいくようです。

SELECT * FROM table_name WHERE 
CASE 
    WHEN EXISTS(SELECT * FROM table_name WHERE field1='value1') THEN field1= 'value1' 
    ELSE field1='default' 
END 
+0

これは動作しません – TheGameiswar

+0

それは働いています私はポストグルで試してみました。 – user2713255

0

あなたはこれを試みることができる...

select * table_name where field1="default" 
and not exists (select * from table_name where field1="value1") 
union all 
select * from table_name where field1="value1" 
0

あなたはcountチェックしてcaseステートメントを使用することができます。

select * 
    from table_name 
where coulmn_1 = (case 
     when (select count(1) from dc_date_card where coulmn_1 = value_1) > 0 then 
value_1 
else 
    Default 
    end) 
+0

case式であり、ステートメントではありません。 – jarlh

1

coalesce()を用いて最適解:

Select * from table_name where field1 = coalesce (
    (select field1 from table_name where field1='value1' limit 1) 
    , 'default' 
); 

予告サブクエリでlimit 1:この場合には、その副選択が複数の行を返さない保証するために必須です。しかし、case when exists (...)アプローチを使用しても、それを追加することをお勧めします。そうしないと、データベースエンジンはサブクエリに一致するすべての行を強制的にスキャンできます。

もちろん、ほとんどの最新のデータベースは、それを静かに最適化するためにスマートなenougthです。しかし、いくつかの古いものはできませんでした。そして、とにかく、それは彼らが傾けるケースかもしれません。

たとえばPostgreSQLでは、サブクエリが安定していない(または適切に宣言されていない)安定関数を使用すると、プランナはフルスキャンを実行して、その関数にs | ide効果。