在 Oracle PL/SQL 中,当列的其余值相等时,我可以交换表中两个不同行的同一列的值吗?

Posted

技术标签:

【中文标题】在 Oracle PL/SQL 中,当列的其余值相等时,我可以交换表中两个不同行的同一列的值吗?【英文标题】:In Oracle PL/SQL can I swap the value of the same column of two differents rows in a table when the rest of the values of the columns are equal? 【发布时间】:2019-03-29 12:09:11 【问题描述】:

基本上我在为某些行赋值时弄错了。两行在除一个之外的所有列中具有相同的值,并且在该列中的值应该交换。我该如何解决这个问题?

我已经尝试了一些代码,但它仅在其他值之一不同时才有效,以便将其用作参考。但是当所有其他值都相同时,它将不起作用。

在“bar”列中,我只想交换两行的值。

foo bar foo21 2 41 3 4

【问题讨论】:

如果所有其他值都相同,那么问题出在哪里?在这里,您有一行具有值 (1, 2, 4),而另一行具有值 (1, 3, 4)。即使您确实在行之间交换 2 和 3,您仍然有两行具有值 (1, 2, 4) 和 (1, 3, 4)。换句话说,没有区别。也许更重要的是——这张桌子上的主键是什么?如果 PK=(foo, bar, foo2) 那么你不应该改变 bar 的值,因为主键是 1. Never NULL, 2. Unique, 3. Unchanged。许多人忘记或方便地忽略了最后一个限制,但是 - 好吧,你来了。 问题是如果我能够交换值,这只是一个例子,可能有一些其他列具有不同的值 【参考方案1】:

您可以使用 CASE 语句来做到这一点:

update the_table
   set the_column = case pk_column
                      when 1 then (select the_column from the_table where pk_column = 2)
                      when 2 then (select the_column from the_table where pk_column = 1)
                    end
where pk_column in (1,2);

以上假设pk_column 被定义为唯一的。

【讨论】:

我可以在 where 语句之后附加一个“and”子句来限制哪些行会受到影响吗?提前致谢

以上是关于在 Oracle PL/SQL 中,当列的其余值相等时,我可以交换表中两个不同行的同一列的值吗?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle PL/SQL 过程/函数来创建包含列的视图

Oracle PL/SQL表记录类型

在用户只能访问与其 id 列相关的列的条件下向用户授予选择列权限 - Oracle pl/sql

如何修改plsql数据库列的属性值?

当列中的行为空时,ORACLE显示计数为零

“如何修复 oracle pl/sql 中的触发器?