<mệnh đề tập hợp> '<gán nhiều cột>


7

Tôi chỉ biết một chút cơ bản về sql và cần phải viết một cú pháp / công cụ kiểm tra sql đơn giản. Vì vậy, tôi đang chiến đấu với tiêu chuẩn này ... một SETtheo cách đó.

Định nghĩa của nó trông như thế này:

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

Trong đó thiết lập danh sách mục tiêu được xác định theo cách này:

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

Điều này nghe với tôi như người ta có thể làm:

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

Để cập nhật giá trị của A thành 1, B lên 2 và C thành 3.

Những gì tôi làm cho thú vị là =vì tôi chưa bao giờ thấy một SET theo cách này và không thể tìm thấy bất kỳ ví dụ nào trên web bằng cách đó.

Vì vậy, tôi cũng không chắc chắn về việc hiểu toàn bộ định nghĩa đúng.

Ai đó có thể cho tôi biết điều này là chính xác? Và nếu không phải như vậy, bạn có thể giải thích cho tôi định nghĩa này định nghĩa khác không?


Câu trả lời:


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

Vâng, sự hiểu biết của bạn là chính xác và đây là cú pháp SQL hoàn toàn hợp pháp. Như @a_horse_with_no_name đề cập trong các ý kiến, bạn cũng có thể sử dụng nó trong điều kiện ( WHERE, HAVING, CASE WHEN, ...).
Ví dụ:

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)

Các BETWEENđiều kiện bất bình đẳng (bao gồm ) sử dụng thứ tự từ điển, do đó, giá trị (3, 0, 17)sẽ dẫn đến đúng cho các ví dụ thứ 2 và thứ 4 ở trên.

Nó cũng có thể được sử dụng để hoán đổi các giá trị từ 2 cột:

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

Tuy nhiên, không phải tất cả các cơ sở dữ liệu đã thực hiện cú pháp này. Theo như tôi biết, chỉ trong PostgreSQL, tất cả những thứ này đều hoạt động.

Trong MySQL, nó hoạt động với =, >=, <=, <>INnhưng không phải với BETWEENcũng không phải trong một bài tập (như UPDATE).

Trong Oracle không có biến thể nào hoạt động nhưng người ta có thể sử dụng biến thể này, nếu truy vấn con trả về một hàng:

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

Vì vậy, đối với một bản cập nhật đơn giản, nó có thể là:

SET (a, b, c) = (SELECT 1, 2, 3 FROM dual)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.