为了账号安全,请及时绑定邮箱和手机立即绑定

如果 1 大于其他,sql 查询交换列

如果 1 大于其他,sql 查询交换列

PHP
海绵宝宝撒 2023-04-28 14:36:35
如果第 1 列的数字大于第 2 列的数字,我有 2 列,其中有一个数字我想交换这两列之间的值。有没有一种简单的方法可以通过查询来做到这一点?开始:id | column 1 | column 2------------------------1   50         32   51         4结束:id | column 1 | column 2------------------------1   3          502   4          51
查看完整描述

3 回答

?
叮当猫咪

TA贡献1776条经验 获得超12个赞

你不能只是交换价值。您需要临时变量第一种方式:

 UPDATE table_name SET column1=column2, column2=@temp WHERE (@temp:=column1) > column2;

第二种方式:这种方式更好,因为它检查任何值是否为 NULL

UPDATE table_name SET column1=(@temp:=column1), column1= column2, column2 = @temp WHERE column1 > column2;

第二种方式很简单。它比较两个列并在需要时交换这个列。


查看完整回答
反对 回复 2023-04-28
?
慕标琳琳

TA贡献1830条经验 获得超9个赞

在UPDATE语句中,MySql 在使用更新列的值时使用非标准 SQL 行为,因为在这样的语句中:


SET a = x, b = a

a赋值中的值b = a不会是表中存储的原始值,而是a赋值后的值a = x。

所以这:


update tablename

set column1 = column2,

    column2 = column1

在其他数据库中可以使用的方法在 MySql 中不起作用。


有一个不使用变量或不必要的连接的解决方法:


update tablename

set column1 = column1 + column2,

    column2 = column1 - column2,

    column1 = column1 - column2

where column1 > column2;

从以下开始工作:


单表 UPDATE 分配通常从左到右评估。

结果:

| id  | column1 | column2 |

| --- | ------- | ------- |

| 1   | 3       | 50      |

| 2   | 4       | 51      |


查看完整回答
反对 回复 2023-04-28
?
慕斯王

TA贡献1864条经验 获得超2个赞

您在表上有一个主键,所以一个简单的选择是join:


update t join

       t t2

       on t.id = t2.id

    set t.x = t2.y, 

        t.y = t2.x

    where t.x > t.y;

这是一个 db<>fiddle。


出于以下几个原因,我更喜欢这种方法而不是使用变量:


这不取决于子句的评估顺序set,我认为 MySQL 不能保证这一点。

我认为在 MySQL 8+ 中不推荐使用这种变量

它不依赖于表达式的顺序,因此更健壮并且更容易适应更复杂的表达式。


查看完整回答
反对 回复 2023-04-28
  • 3 回答
  • 0 关注
  • 94 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信