我只知道一些sql的基础知识,需要编写一个简单的sql语法高亮/检查程序,所以我正在通过标准.有时我不确定我是否理解得对,因为我从未见过有人以这种方式使用SET。
其定义如下:
<multiple column assignment> ::=
<set target list> <equals operator> <assigned row>其中,set目标列表是这样定义的:
<set target list> ::=
<left paren> <set target> [ { <comma> <set target> }... ] <right paren>这听起来像我所能做的那样:
UPDATE ...
SET (A, B, C) = (1, 2, 3)将A值更新为1,B值更新为2,C值更新为3。
让我反思广益的是=,因为我从来没有见过这样的集合,在网络上也找不到这样的例子。
所以我也不确定是否正确理解了整个定义。
有人能告诉我这是对的吗?如果不是这样的话,你能解释一下这个定义是怎么定义的吗?
发布于 2014-12-17 14:32:58
UPDATE ...
SET (a, b, c) = (1, 2, 3) ;是的,您的理解是正确的,这是完全合法的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)不等式(包括BETWEEN)条件使用字典排序,因此对于上述第2和第4个例子,(3, 0, 17)值将为真。
它还可用于交换来自2列的值:
UPDATE ...
SET (a, b) = (b, a) ;然而,并非所有数据库都实现了这种语法。据我所知,只有在PostgreSQL中,所有这些工作。
在MySQL中,它适用于=、>=、<=、<>和IN,但既不适用于BETWEEN,也不适用于赋值(如UPDATE)。
在Oracle中,任何变体都不能工作,但如果子查询返回一行,则可以使用该变体:
SET (a, b, c) = (SELECT expression_a, expression_b, expression_b FROM ...)因此,对于一个简单的更新,可以是:
SET (a, b, c) = (SELECT 1, 2, 3 FROM dual)https://dba.stackexchange.com/questions/86373
复制相似问题