<set 子句> 的 <multiple column assignment>

Zai*_*bis 7 sql-standard

我只知道一点 sql 基础知识,需要编写一个简单的 sql 语法荧光笔/检查器所以我正在努力通过标准......我偶然发现了一些我不确定我是否理解正确的东西,因为我从未见过有人使用一个SET以这种方式。

它的定义如下所示:

<multiple column assignment> ::=
<set target list> <equals operator> <assigned row>
Run Code Online (Sandbox Code Playgroud)

以这种方式定义设置目标列表的地方:

<set target list> ::=
<left paren> <set target> [ { <comma> <set target> }... ] <right paren>
Run Code Online (Sandbox Code Playgroud)

这对我来说听起来是可以做到的:

UPDATE ...
SET (A, B, C) = (1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

将 A 的值更新为 1,B 的值更新为 2,C 的值更新为 3。

我让反刍的是=因为我从来没有见过这样的 SET 并且在网上找不到任何使用这种方式的例子。

所以我也不确定是否正确理解整个定义。

有人能告诉我这是正确的吗?如果不是这样,你能解释一下这个定义的其他定义吗?

ype*_*eᵀᴹ 5

UPDATE ...
SET (a, b, c) = (1, 2, 3) ;
Run Code Online (Sandbox Code Playgroud)

是的,您的理解是正确的,这是完全合法的 SQL 语法。正如评论中提到的@a_horse_with_no_name,您也可以在条件 ( WHERE, HAVING, CASE WHEN, ...) 中使用它。
例子:

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)
Run Code Online (Sandbox Code Playgroud)

不等式(包括BETWEEN)条件使用字典顺序,因此(3, 0, 17)对于上述第 2 和第 4 个示例,值 的结果为 true。

它还可以用于交换 2 列中的值:

UPDATE ...
SET (a, b) = (b, a) ;
Run Code Online (Sandbox Code Playgroud)

然而,并非所有数据库都实现了这种语法。据我所知,只有在 PostgreSQL 中,所有这些工作。

在 MySQL 中,它与=, >=, <=, 一起工作<>IN但既不与BETWEEN也不在赋值中(如UPDATE)。

在 Oracle 中,如果子查询返回一行,则任何变体都不起作用,但可以使用它:

SET (a, b, c) = (SELECT expression_a, expression_b, expression_b FROM ...)
Run Code Online (Sandbox Code Playgroud)

所以对于一个简单的更新,它可以是:

SET (a, b, c) = (SELECT 1, 2, 3 FROM dual)
Run Code Online (Sandbox Code Playgroud)