die <Mehrfachspaltenzuweisung> der <Set-Klausel>


7

Ich kenne nur ein paar SQL-Grundlagen und muss einen einfachen SQL-Syntax-Textmarker / Checker schreiben. Also kämpfe ich mich durch den Standard ... Ich bin über etwas gestolpert, bei dem ich nicht sicher bin, ob ich es richtig verstehe, da ich noch nie jemanden gesehen habe, der es verwendet a SETauf diese Weise.

Die Definition sieht folgendermaßen aus:

<multiple column assignment> ::=
<set target list> <equals operator> <assigned row>

Wo die festgelegte Zielliste folgendermaßen definiert wird:

<set target list> ::=
<left paren> <set target> [ { <comma> <set target> }... ] <right paren>

Das klingt für mich so, wie man es tun könnte:

UPDATE ...
SET (A, B, C) = (1, 2, 3)

Um den Wert von A auf 1, den Wert von B auf 2 und den Wert von C auf 3 zu aktualisieren.

Was ich wiederkäuend mache, ist das, =da ich noch nie ein SET auf diese Weise gesehen habe und keine Beispiele im Web finden kann, die es auf diese Weise verwenden.

Daher bin ich mir auch nicht sicher, ob ich die gesamte Definition richtig verstehen soll.

Könnte mir jemand sagen, ob das richtig ist? Und wenn nicht, können Sie mir erklären, was diese Definition anders definiert?


Antworten:


5
UPDATE ...
SET (a, b, c) = (1, 2, 3) ;

Ja, Ihr Verständnis ist korrekt und dies ist eine vollkommen legale SQL-Syntax. Wie @a_horse_with_no_name in den Kommentaren erwähnt, können Sie es auch in Bedingungen verwenden ( WHERE, HAVING, CASE WHEN, ...).
Beispiele:

WHERE (a,b,c) = (1, 2, 3)

WHERE (a,b,c) >= (1, 2, 3)

WHERE (a,b,c) IN ((1, 2, 3), (1, 1, 1), (2, 2, 2), (4, 5, 6))

WHERE (a,b,c) BETWEEN (1, 2, 3) AND (4, 5, 6)

Die Ungleichheitsbedingungen (einschließlich BETWEEN) verwenden die lexikografische Reihenfolge, sodass (3, 0, 17)sich für die obigen 2. und 4. Beispiele ein Wert von als wahr ergeben würde.

Es kann auch zum Austauschen der Werte aus 2 Spalten verwendet werden:

UPDATE ...
SET (a, b) = (b, a) ;

Nicht alle Datenbanken haben diese Syntax jedoch implementiert. Soweit ich weiß, funktionieren alle diese Funktionen nur in PostgreSQL.

In MySQL, es funktioniert mit =, >=, <=, <>und INdoch weder mit BETWEENnoch in einer Zuweisung (wie UPDATE).

In Oracle funktioniert keine der Variationen, aber man kann dies verwenden, wenn die Unterabfrage eine Zeile zurückgibt:

SET (a, b, c) = (SELECT expression_a, expression_b, expression_b FROM ...)

Für ein einfaches Update kann es also sein:

SET (a, b, c) = (SELECT 1, 2, 3 FROM dual)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.