首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 ><set子句>‘S<多列assignment>

<set子句>‘S<多列assignment>
EN

Database Administration用户
提问于 2014-12-17 08:11:05
回答 1查看 128关注 0票数 7

我只知道一些sql的基础知识,需要编写一个简单的sql语法高亮/检查程序,所以我正在通过标准.有时我不确定我是否理解得对,因为我从未见过有人以这种方式使用SET

其定义如下:

代码语言:javascript
复制
<multiple column assignment> ::=
<set target list> <equals operator> <assigned row>

其中,set目标列表是这样定义的:

代码语言:javascript
复制
<set target list> ::=
<left paren> <set target> [ { <comma> <set target> }... ] <right paren>

这听起来像我所能做的那样:

代码语言:javascript
复制
UPDATE ...
SET (A, B, C) = (1, 2, 3)

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

让我反思广益的是=,因为我从来没有见过这样的集合,在网络上也找不到这样的例子。

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

有人能告诉我这是对的吗?如果不是这样的话,你能解释一下这个定义是怎么定义的吗?

EN

回答 1

Database Administration用户

发布于 2014-12-17 14:32:58

代码语言:javascript
复制
UPDATE ...
SET (a, b, c) = (1, 2, 3) ;

是的,您的理解是正确的,这是完全合法的SQL语法。正如@a_horse_with_no_name在注释中提到的那样,您也可以在条件(WHEREHAVINGCASE WHEN、.)中使用它。

示例:

代码语言:javascript
复制
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列的值:

代码语言:javascript
复制
UPDATE ...
SET (a, b) = (b, a) ;

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

在MySQL中,它适用于=>=<=<>IN,但既不适用于BETWEEN,也不适用于赋值(如UPDATE)。

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

代码语言:javascript
复制
SET (a, b, c) = (SELECT expression_a, expression_b, expression_b FROM ...)

因此,对于一个简单的更新,可以是:

代码语言:javascript
复制
SET (a, b, c) = (SELECT 1, 2, 3 FROM dual)
票数 5
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/86373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档