У меня есть следующий код для копирования данных из одной таблицы в другую:

INSERT INTO MyDb.Books (CategoryId, Author, Title)
SELECT 
  CategoryId, Author, Title
FROM MyDbBackup.Books

Мне нужно применить следующее преобразование при копировании значений CategoryId:

+---------------------+-----------------+
|     Old CategoryId  |  New CategoryId |
+---------------------+-----------------+
|                  1  |               2 |
|                  2  |               1 |
|                  3  |               3 |
|                  4  |               4 |
|                  5  |               8 |
|                 14  |               6 |
|                 15  |               7 |
|                 18  |               5 |
|                 22  |               9 |
+---------------------+-----------------+

Как я могу это сделать?

2
Miguel Moura 23 Фев 2018 в 15:06

4 ответа

Лучший ответ

Вы могли бы использовать случай, когда

INSERT INTO MyDb.Books (CategoryId, Author, Title)
SELECT 
  case when CategoryId = 1 then 2
       when CategoryId = 2 then 1
       when CategoryId = 5 then 8
       when CategoryId = 14  then 6
       when CategoryId = 15  then 7
       when CategoryId = 18  then 5
       when CategoryId = 22  then 9
       else cateogoryId end, Author, Title
FROM MyDbBackup.Books

Или менее многословный способ

INSERT INTO MyDb.Books (CategoryId, Author, Title)
SELECT 
  case CategoryId 
       when  1 then 2
       when 2 then 1
       when 5 then 8
       when 14  then 6
       when 15  then 7
       when 18  then 5
       when 22  then 9
       else cateogoryId end, Author, Title
FROM MyDbBackup.Books
1
scaisEdge 23 Фев 2018 в 13:02

Поскольку формулы не существует, преобразование должно быть выполнено одно за другим:

INSERT INTO MyDb.Books (CategoryId, Author, Title)
SELECT CASE CategoryID WHEN 1 THEN 2
                       WHEN 2 THEN 1
                       WHEN 5 THEN 8
                       WHEN 14 THEN 6
                       WHEN 15 THEN 7
                       WHEN 18 THEN 5
                       WHEN 22 THEN 9
                      ELSE CategoryId ID END AS CategoryId
       , Author, Title
FROM MyDbBackup.Books
1
Racil Hilan 23 Фев 2018 в 12:13

Одним из методов является использование таблицы поиска a join:

select v.newid, b.author, b.title
from MyDbBackup.Books b join
     (values (1, 2), (2, 1), (3, 3), (4, 4), (5, 8), (14, 6), (15, 7), (18, 5), (22, 9)
     ) v(oldid, newid)
     on b.CategoryId = v.oldid;

Альтернативой является использование выражения case. Однако использование join гарантирует, что в наборе результатов будет только набор книг со старыми идентификаторами. Таким образом, он выполняет поиск и фильтрацию.

Если вам не нужна фильтрация, вы можете использовать left join вместо внутреннего соединения.

1
Gordon Linoff 23 Фев 2018 в 12:11

Как сказано в комментариях Panagiotis Kanavos, вам нужно использовать выражение CASE:

CASE CategoryID WHEN 1 THEN 2
                WHEN 2 THEN 1
                WHEN 5 THEN 8
                WHEN 14 THEN 6
                WHEN 15 THEN 7
                WHEN 18 THEN 5
                WHEN 22 THEN 9
                ELSE CategoryID END
1
Larnu 23 Фев 2018 в 12:11