首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL -交换一行中两列的值

问MySQL -交换一行中两列的值
EN

Stack Overflow用户
提问于 2015-03-06 11:05:50
回答 2查看 4.5K关注 0票数 4

我试图更正一个存储两年的表格中的一些数据:

代码语言:javascript
复制
id | start_year | end_year
---|------------|---------
1  |    2001    |   2003
2  |    2008    |   2005
3  |    2004    |   2010
4  |    2012    |   NULL
5  |    2003    |   2004

就像在第二排,岁月是不对的。如何在start_year > end_year行上交换这些列的值

注意:不应该交换行4,其中end_year为NULL。这应该保持不变。

EN

回答 2

Stack Overflow用户

发布于 2015-03-06 11:33:51

一点点数学魔法可以帮上忙:

代码语言:javascript
复制
UPDATE myTable
SET start_year = start_year - end_year,
    end_year   = end_year + start_year,
    start_year = end_year - start_year
WHERE start_year > end_year
  AND end_year IS NOT NULL

备注

我不知道这种更新方法有多可靠。为了达到预期效果,必须计算表达式,并且必须按照查询中显示的顺序执行赋值。如果MySQL决定以不同的顺序计算或分配它们,那么查询将在表中产生混乱。

摘录自手册

单表更新分配通常从左到右进行评估。对于多个表更新,无法保证任务按任何特定顺序执行.

从上面的片段来看,是否从左到右对赋值进行评估并不十分清楚。它说的“一般”,但它没有解释什么是例外。

我使用问题中提供的小样本数据对MySQL 5.5.24上的查询进行了测试,它如预期的那样工作。

建议

在运行此查询之前备份您的表。你已经被警告了!

票数 0
EN

Stack Overflow用户

发布于 2015-03-06 11:07:33

警告,下面的一般/ANSI SQL答案将而不是用于MySQL:

代码语言:javascript
复制
update tablename
  set start_year = end_year,
      end_year = start_year
where start_year > end_year
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28897482

复制
相关文章

相似问题

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