有什么方法可以将价值从一个细胞转移到另一个

时间:2008-10-09 19:07:10

标签: sql mysql database

SQL语言或MySQL(或其他DBMA)中是否有任何方法可以将值从一个单元格传输到另一个单元格?例如,假设有一个名为user_cars的表,其结构如下:

|id| |user_name| |num_cars|
鲍勃有5辆车,约翰有3辆车。在一个查询中是否有任何方法可以从Bob中减去2辆汽车并将2添加到John?我知道这可以通过两个更新查询完成,但我只想知道是否有更有效的方法。

6 个答案:

答案 0 :(得分:4)

对于Oracle,您可以这样做。不知道mysql中是否有等价物。显然,这个特定的陈述非常具体到你所说的例子。

 UPDATE user_cars
   SET num_cars = num_cars +
                     CASE WHEN user_name='Bob' THEN -2
                          WHEN user_name='John' THEN +2
                     END
   WHERE user_name IN ( 'Bob', 'John' )

答案 1 :(得分:2)

这样可行,但不愉快:

UPDATE USER_CARS UC
SET
  NUM_CARS = NUM_CARS + CASE WHEN UC.USER_NAME = 'Bob'
                             THEN -2  --take from bob
                             WHEN UC.USER_NAME = 'John'
                             THEN 2  --give to John
                             ELSE 0  --no change for anybody else
                        END

答案 2 :(得分:1)

这就是交易的目的......

答案 3 :(得分:1)

正如其他人所解释的那样,你可以用CASE声明来做 但是,这样做可能是不明智的,因为它使代码的意图更难以看到。这将使后续程序员更难理解代码的用途。

除非您有一些特定的理由需要在一个语句中执行此操作,否则最好的办法是使用2个更新语句,如果需要,将它们包装在事务中。

我经常回想起这句引文(虽然我必须在wikiquote上查找归因):

“必须编写程序供人们阅读,并且只能偶然为机器执行。”   - Abelson& Sussman,SICP,第一版序言

答案 4 :(得分:0)

如果您真的想在一个查询中执行此操作,则可以对表的自联接进行更新,但它的可读性较低且可能效率较低。

答案 5 :(得分:0)

我同意Jonas Klemming的说法,没有一种有意义的方法可以做到这一点。这正是发明交易的目的。