Обновить поля на основе условия If-Else - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть Table A (источник), который необходимо обновить Table B (цель), в зависимости от нескольких правил. Между обеими таблицами есть совпадающий ключ (email).

Когда поле check1 равно "Hello", а check2 равно "World" из Table B, тогда я хочу обновить три поля.

Однако, если поле check1 равно "Hello" и check2 равно "Pineapple" из Table B, тогда я хочу обновить только одно поле.

Pseudo код ниже:

SELECT Name, City, Phone
FROM A

IF B.check1="Hello" AND B.check2="World" THEN
    update B.Name = A.Name, 
    update B.City = A.City,
    update B.Phone = A.Phone

ELSE IF B.check1="Hello" AND B.check2="Pineapple" THEN
    update B.Name = A.Name

ENDIF

INNER JOIN B
ON A.email = B.email

Примеры таблиц:

ТАБЛИЦА A

+-----------------------+------+------+-------------+
| Email                 | Name | City | Phone       |
+-----------------------+------+------+-------------+
| customer1@example.com | John | NYC  | 123-123-123 |
+-----------------------+------+------+-------------+
|                       |      |      |             |
+-----------------------+------+------+-------------+

ТАБЛИЦА B

+-----------------------+--------+--------+------+------+-------------+
| Email                 | check1 | check2 | Name | City | Phone       |
+-----------------------+--------+--------+------+------+-------------+
| customer1@example.com | Hello  |  World |      |      |             |
+-----------------------+--------+--------+------+------+-------------+
|                       |        |        |      |      |             |
+-----------------------+--------+--------+------+------+-------------+

RESULT (ЕСЛИ в первом случае)

+-----------------------+--------+--------+------+------+-------------+
| Email                 | check1 | check2 | Name | City | Phone       |
+-----------------------+--------+--------+------+------+-------------+
| customer1@example.com | Hello  |  World | John | NYC  | 123-123-123 |
+-----------------------+--------+--------+------+------+-------------+
|                       |        |        |      |      |             |
+-----------------------+--------+--------+------+------+-------------+

Ответы [ 2 ]

3 голосов
/ 17 апреля 2020

Вы не можете условно обновить столбец, нужно либо обновить столбец, либо нет. Но вы можете условно изменить значение, используя case expression. Используя ваши условия, вы можете либо установить для указанных столбцов новые значения, либо сохранить старые значения следующим образом.

update B set
  [Name] = case when B.check1 = 'Hello' and B.check2 in ('World','Pineapple') then A.[Name] else B.[Name] end
  , City = case when B.check1 = 'Hello' and B.check2 in ('World') then A.City else B.City end
  , Phone = case when B.check1 = 'Hello' and B.check2 in ('World') then A.Phone else B.Phone end
from TableB B
inner join TableA A on A.email = B.email;

Примечание: вы можете сделать то же самое с iif (это просто сокращение для case ), Я предпочитаю case.

0 голосов
/ 17 апреля 2020

Вы не можете таким образом.

Лично я бы сделал много обновлений, но если бы вы настаивали на том, чтобы сделать это в одном, было бы:

set
b.Name = a.Name,
b.City = iif(b.check2 = "something", a.City, b.City),
b.Phone = iif(b.check2 = "something", a.Phone, b.Phone)
...