Почему значение NULL вводится в мою базу данных, когда я использую CASE для своего оператора SQL UPDATE? - PullRequest
0 голосов
/ 16 сентября 2018

Чтобы предотвратить отправку нескольких операторов SQL в базу данных следующим образом:

UPDATE `gmw-db-051514`.`gmw_provider`
SET `gmw_provider`.`is_partner` = TRUE,
`partner_url` = 'some-url',
`partner_remove_token` = 'ABC123'
WHERE `gmw_provider`.`provider_id` = '11';

UPDATE `gmw-db-051514`.`tbl_conversations`
SET `tbl_conversations`.`partner_initial_id` = 30
WHERE `tbl_conversations`.`user_initial_id` = 30;

UPDATE `gmw-db-051514`.`tbl_conversations`
SET `tbl_conversations`.`partner_target_id` = 30
WHERE `tbl_conversations`.`user_following_id` = 30;

... Я хотел бы объединить эти операторы SQL в один.Я знаю, что могу использовать IF и CASE в операторах MYSQL, но думаю, что я использую их неправильно.

Это моя попытка использовать оператор CASE

UPDATE
  `gmw-db-051514`.`gmw_provider`,
  `gmw-db-051514`.`tbl_conversations`
SET
  `gmw_provider`.`is_partner` = true,
  `partner_url` = 'some-url',
  `partner_remove_token` = 'ABC123',
  `tbl_conversations`.`partner_initial_id` =
CASE WHEN 
  `tbl_conversations`.`user_initial_id` = '30' THEN '30' END,
  `tbl_conversations`.`partner_target_id` =
CASE WHEN 
  `tbl_conversations`.`user_following_id` = '30' THEN '30' END
WHERE
  `gmw_provider`.`provider_id` = '11'

Условие работает,но если в строке уже есть значение, оно переписывается в ноль.

Посмотрите на эту таблицу:

 |user_initial_id|user_following_id|partner_initial_id|partner_target_id|
 |     30        |        41       |       NULL       |        41       |
 |     51        |        41       |       NULL       |        41       |
 |     37        |        30       |       NULL       |        NULL     |

После выполнения оператора UPDATE это выглядит следующим образом (41ушел)

 |user_initial_id|user_following_id|partner_initial_id|partner_target_id|
 |     30        |        41       |       30         |        NULL     |
 |     51        |        41       |       NULL       |        NULL     |
 |     37        |        30       |       NULL       |        30       |

Но это должно выглядеть так (41 еще там и 30 добавлено):

 |user_initial_id|user_following_id|partner_initial_id|partner_target_id|
 |     30        |        41       |       30         |        41       |
 |     51        |        41       |       NULL       |        41       |
 |     37        |        30       |       NULL       |        30       |

Строка user_initial_id соответствует partner_initial_id .

Строка user_following_id соответствует partner_target_id .

Как это:

        A                 B                 A                  B
 |user_initial_id|user_following_id|partner_initial_id|partner_target_id|

Можете ли выпомочь мне с этой или другой попыткой?Оператор «IF» приводит к тому же результату.

Конечно, я использовал google и нашел похожие вопросы здесь по stackoverflow, но примеры были более простыми и не в сочетании с другой таблицей.Я боялся, что это может повлиять на точное решение для этих условий.

Если вы не можете мне помочь, я использую версию с несколькими запросами, но мне это кажется очень уродливым.

Спасибо!

РЕДАКТИРОВАТЬ: Моя проблема была решена, и я узнал что-то новое!Если кто-то ищет подобное решение, подумайте: 1.) Использование объединений 2.) Не бойтесь «отправки нескольких запросов через одно и то же соединение»: -)

Благодаря @dognose и @gordon Linoff!

1 Ответ

0 голосов
/ 16 сентября 2018

Вам нужно предложение else для case:

  `tbl_conversations`.`partner_initial_id` =
(CASE WHEN `tbl_conversations`.`user_initial_id` = '30' THEN '30' 
      ELSE `tbl_conversations`.`partner_initial_id` END)

Я бы также порекомендовал псевдонимы таблиц и явные условия JOIN.

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