Любой способ передать значение из одной ячейки в другую? - PullRequest
0 голосов
/ 09 октября 2008

Есть ли способ на языке SQL или в MySQL (или другой DBMA) для передачи значения из одной ячейки в другую? Например, допустим, есть таблица user_cars со следующей структурой:

|id| |user_name| |num_cars|

У Боба 5 машин, а у Джона 3 машины. Есть ли способ в одном запросе вычесть 2 машины от Боба и добавить 2 к Джону? Я знаю, что это можно сделать с помощью двух запросов на обновление, но я просто хотел бы знать, существует ли более эффективный способ.

Ответы [ 6 ]

4 голосов
/ 09 октября 2008

Для 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' )
2 голосов
/ 09 октября 2008

Это будет работать, но это не приятно:

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
1 голос
/ 13 октября 2008

Как объяснили другие, вы можете сделать это с помощью оператора CASE.
Однако делать это, вероятно, неразумно, так как это затрудняет понимание намерений кода. Это усложнит последующему программисту понимание цели кода.

Если у вас нет какой-либо конкретной причины для необходимости делать это в одном операторе, лучше всего использовать 2 оператора обновления, при необходимости оборачивая их в транзакцию.

Я часто вспоминаю эту цитату (хотя мне пришлось искать атрибуцию на wikiquote ):

"Программы должны быть написаны для того, чтобы люди могли читать, и только для машин, которые выполняются". - Abelson & Sussman, SICP, предисловие к первому изданию

1 голос
/ 09 октября 2008

Вот для чего нужны транзакции ...

0 голосов
/ 12 октября 2008

Я согласен с Йонасом Клеммингом, не существует осмысленного способа сделать это. Это именно то, для чего были изобретены транзакции.

0 голосов
/ 09 октября 2008

Если вы действительно хотите сделать это в одном запросе, вы можете сделать обновление для самостоятельного объединения таблицы, но оно менее читабельно и, вероятно, менее эффективно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...