Czy instrukcja SQL Server (w szczególności 2008 lub 2012) CASE
ocenia wszystkie WHEN
warunki, czy też wychodzi, gdy znajdzie WHEN
klauzulę, która ma wartość true? Jeśli przejdzie przez cały zestaw warunków, czy to oznacza, że ostatni warunek oceniający na prawda zastępuje to, co zrobił pierwszy warunek, który oceniono na prawda? Na przykład:
SELECT
CASE
WHEN 1+1 = 2 THEN'YES'
WHEN 1+1 = 3 THEN 'NO'
WHEN 1+1 = 2 THEN 'NO'
END
Wynikiem jest „TAK”, chociaż ostatni warunek, w którym warunek powinien dać wynik „NIE”. Wygląda na to, że kończy działanie, gdy znajdzie pierwszy PRAWDZIWY warunek. Może ktoś proszę potwierdzić, czy jest to przypadek .
sql-server
t-sql
case
Juan Velez
źródło
źródło
COALESCE()
to tłumaczy się naCASE
wyrażenie).Odpowiedzi:
• Zwraca wynik_wyrażenia pierwszego wyrażenia_wejściowego = wyrażenie_czasu, którego wynikiem jest PRAWDA .
Odwołanie http://msdn.microsoft.com/en-us/library/ms181765.aspx
To jest standardowe zachowanie SQL:
CASE
Wyrażenie do pierwszego prawdziwego stanu.Jeśli nie ma żadnego prawdziwego warunku, ocenia to
ELSE
część.Jeśli nie ma żadnego prawdziwego warunku i żadnej
ELSE
części, ocenia toNULL
.źródło
SQL Server zwykle wykonuje ocenę zwarcia dla instrukcji CASE ( SQLFiddle ):
Istnieje jednak kilka rodzajów instrukcji, które od SQL Server 2012 nie powodują prawidłowego zwarcia. Zobacz link z ypercube w komentarzach.
Oracle zawsze dokonuje oceny zwarcia . Zobacz 11.2 Opis języka SQL . Lub porównaj następujące ( SQLFiddle ):
Tego samego testu nie można wykonać w MySQL, ponieważ zwraca NULL dla dzielenia przez zero. ( Skrzypce SQL )
źródło
Wygląda na to, że MS SQL Server stosuje również ocenę zwarcia.
W poniższym teście mam 3 testy. Pierwszy jest zawsze prawdziwy, drugi kończy się niepowodzeniem bez odwoływania się do tabeli, a trzeci kończy się niepowodzeniem tylko wtedy, gdy uwzględni się dane.
W tym konkretnym uruchomieniu oba wiersze są zwracane pomyślnie. Jeśli skomentuję pierwszy KIEDY, lub pierwszy i drugi, wtedy dostaję błędy.
źródło
jeśli instrukcja case zastosowana w tym
WHERE
warunku i pierwszy przypadek, gdy instrukcja obejmuje ocenę wartości kolumn z tabeli, a pierwszy wiersz w tabeli nie spełnia tego warunku, instrukcja case przejdzie do następnego przypadku, gdy instrukcja.źródło
W MySQL wyjdzie z instrukcji case dla pierwszej prawdziwej opcji. Jeśli masz możliwość podania wielu prawdziwych wartości, chcesz umieścić preferowaną odpowiedź wcześniej w sekwencji.
źródło