2016-08-02 36 views
6

Mam przypadek, w którym muszę pobrać rekordy dla pola kolumn1 = "wartość1", jeśli nie ma wartości "wartość1", wówczas powinienem pobrać rekord dla "domyślny".Jak wrócić do innej wartości w klauzuli WHERE?

Do powyższej sytuacji użyłem dwa zapytania:

Select * from table_name where field1="value1"

Jeśli powyższe zapytanie nie oddać żadnego rekordu I ogień następujące zapytanie:

Select * from table_name where field1="default"

Teraz chcę wykonać powyższe stwierdzenie w jednym zapytaniu. Czy ktoś może mi pomóc z tym samym. Wierzę, że odpowiedź leży gdzieś w użyciu klauzuli CASE WHEN.

Również powyższe zapytania powinny działać dla oracle, postgres oraz mysql.

+4

Jakie rdbms używasz? –

+0

Postgres, mysql i Oracle – user2713255

Odpowiedz

3

przypadek użycia i występuje jak poniżej

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

dla MySQL:

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

Rdzeń ANSI SQL odpowiedź, oczekuje się działać na wszystkich innych platformach:

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

porządku, wypróbowany to wydaje się działać.

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

To nie zadziała – TheGameiswar

+0

Działa, próbowałem w postgres. – user2713255

0

Można spróbować to ...

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

Można użyć case oświadczenie z count czeku.

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 expression, not statement. – jarlh

1

Optymalne rozwiązanie wykorzystujące coalesce():

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

Zawiadomienie limit 1 w podkwerendzie W tym przypadku jest konieczne, aby zapewnić, że nie powraca Podzapytanie więcej niż jeden wiersz. Ale nawet przy użyciu podejścia case when exists (...) dobrym pomysłem jest dodanie go, ponieważ inaczej silnik bazy danych może być zmuszony do skanowania wszystkich wierszy zgodnych z podzapytaniem.

Oczywiście najnowocześniejsze bazy danych są inteligentne, aby je zoptymalizować. Ale niektóre stare nie mogły. W każdym razie mogą to być przypadki, w których nie mogą.

To jest, na przykład, w PostgreSQL, jeśli podzapytanie korzysta z nie (lub niepoprawnie deklarowanych jako) stabilnych funkcji, planista musiałby wykonać pełne skanowanie, aby uzyskać spójne wyniki, jeśli ta funkcja ma jakikolwiek efekt s | ide .