2016-06-13 36 views
0

Wenn ich diese Aussage verwenden;SQL Case-When-Else-Anweisung Effizienz

UPDATE TABLE 
    SET FIELD = CASE 
       WHEN NAME = 'a' THEN (SELECT NO FROM TABLE_TWO WHERE NAME = 'a') 
       ELSE 'x' END 
WHERE FIELD_TWO = 1 

wenn TABLE.NAME != 'a' wird die Auswahl SQL trotzdem ausgeführt? Darüber hinaus, eine kleine zusätzliche Frage, denken Sie, es ist richtig, solche Logik in SQL-Code für ein bestimmtes Produkt zu haben? Ich denke, jede Logik in SQL macht seine Berichterstattung sehr schwierig und schwer zu pflegen, was denkst du?

edit: select-Anweisung gibt nur einen einzelnen Wert zurück, ignoriert den Fall, in dem mehrere Werte zurückgegeben werden können, dieser Fall gehört nicht in den Bereich dieser Frage.

+0

Welche DBMS verwenden Sie? Im Allgemeinen: CASE-Anweisungen werden nicht "abgekürzt", daher ist es sehr wahrscheinlich, dass die verschachtelte Auswahl für jede durch die 'where'-Klausel ausgewählte Zeile ausgeführt wird. Aber es hängt davon ab, dass das DBMS verwendet wird. –

+0

Derzeit verwende ich Oracle 12g –

Antwort

1

The Oracle manual behauptet, dass es tut Kurzschlussauswertung:

Oracle Database verwendet Kurzauswertung. Für einen einfachen CASE Ausdruck, die Datenbank jeweils nur comparison_expr Wert auswertet, bevor es zu expr, anstatt Auswertung aller comparison_expr Werte zu vergleichen, bevor einer von ihnen mit ausdr

In Ihrem Fall comparison_expr ist der WHEN NAME = 'a' Teil und wenn der Vergleich Handbuch ist richtig, die Datenbank wird select nicht ausführen, wenn name einen anderen Wert hat.

1

Ich denke, es wäre einfacher, zu lesen und zu pflegen, wenn man es in zwei UPDATE-Aussagen wie diese aufgeteilt:

UPDATE TABLE SET FIELD = (SELECT TOP 1 NO FROM TABLE_TWO WHERE NAME = 'a') 
      WHERE FIELD_TWO = 1 
       AND NAME='a' 
UPDATE TABLE SET FIELD = 'x' 
      WHERE FIELD_TWO = 1 
      AND NAME != 'a' 

Es lässt Sie mehr Fälle leicht hinzufügen und Sie können die Fälle verallgemeinern, wenn es mehr von ihnen, wie:

UPDATE TABLE SET FIELD = (SELECT TOP 1 NO FROM TABLE_TWO WHERE NAME = TABLE.FIELD) 
      WHERE FIELD_TWO = 1 
       AND NAME IN ('a','b','c') 
+0

Ich mag dies, da es die Lesbarkeit verbessert, aber es führt immer noch die innere Auswahl, auch wenn die Bedingungen der ersten Aussage falsch waren, oder? –

1

Wenn ich Sie wäre, würde ich eine Variable verwenden, so dass Fall ein jedes Mal skalaren Wert nicht berechnen. So etwas wie folgt vor:

DECLARE @myVar VARCHAR(10); 

SELECT TOP 1 @myVar = NO FROM TABLE_TWO WHERE NAME = 'a'; 

UPDATE TABLE 
    SET FIELD = CASE 
       WHEN NAME = 'a' THEN @myVar 
       ELSE 'x' END 
WHERE FIELD_TWO = 1 
+0

Frage ist, dass SQL ausgewählt wird unabhängig von der Bedingung in Case-Anweisung ausgeführt werden? Es sieht so aus. –