SQL语言或MySQL(或其他DBMA)中是否有任何方法可以将值从一个单元格传输到另一个单元格?例如,假设有一个名为user_cars的表,其结构如下:
|id| |user_name| |num_cars|
鲍勃有5辆车,约翰有3辆车。在一个查询中是否有任何方法可以从Bob中减去2辆汽车并将2添加到John?我知道这可以通过两个更新查询完成,但我只想知道是否有更有效的方法。
答案 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的说法,没有一种有意义的方法可以做到这一点。这正是发明交易的目的。