2016-08-02 24 views
6

'value1' için değer yoksa, 'default' için kaydı getirmem gerekiyorsa, field1 için alan1 = 'value1' için kayıt almam gereken bir durum var. Ben iki sorgu kullandık yukarıdaki senaryo için'WHERE' yan tümcesi SQL'de farklı bir değere nasıl geri dönülür?

:

Select * from table_name where field1="value1"

Yukarıdaki sorgu aşağıdaki sorguyu yangın herhangi bir kaydı geri vermezse: Artık

Select * from table_name where field1="default"

Ben Bir sorguda belirtilen yukarıdaki yapmak istiyorum. Birisi bana aynı şekilde yardım edebilir. Cevabın CASE WHEN maddesini kullanarak bir yerde yattığına inanıyorum.

Ayrıca yukarıdaki sorgular mysql olarak postgres de, oracle için çalışmalıdır. Mysql için

+4

Hangi rdbms kullanıyorsunuz? –

+0

postgres, mysql ve oracle – user2713255

cevap

3

Kullanım HALİNDE ve benzeri Var

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

Çekirdek ANSI SQL cevap, tüm farklı platformlarda çalıştırmak için beklenen:

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

Tamam altında, i Bunu denedim, çalışıyor gibi görünüyor.

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

Bu işe yaramaz – TheGameiswar

+0

Çalışıyor Postgres denedim. – user2713255

0

Bunu deneyebiliriz ...

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

Sen count çek ile case deyimi kullanabilirsiniz. coalesce() kullanarak

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

Durum ifadesi, ifade değil. – jarlh

1

Optimal çözüm:

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

Bildirim alt sorguda limit 1: Birden fazla satır dönmez o Alt Seç'i sağlamak için zorunludur Bu durumda. Ancak, case when exists (...) yaklaşımını kullanmanız bile iyi bir uygulamadır, çünkü aksi takdirde, veritabanı motoru alt sorgu ile eşleşen tüm satırları taramaya zorlanabilir. Tabii

, en modern veritabanları sessizce optimize etmek akıllı enougth vardır. Ama bazı yaşlılar yapamadı. Ve neyse, onlar cant nerede olabilir. Örneğin, PostgreSQL'de, alt sorguda sabit (veya düzgün olarak bildirilmemiş) kararlı işlevler kullanılıyorsa, planlayıcı, herhangi bir i | ide etkisi varsa, tutarlı sonuçlar üretmek için tam bir taramayı gerçekleştirmek zorunda kalır. .

İlgili konular