Поддержание порядка в запросе DB2 IN - PullRequest
0 голосов
/ 30 ноября 2018

Этот вопрос основан на этом .Я ищу решение этого вопроса, которое работает в DB2.Вот оригинальный вопрос:

У меня есть следующая таблица

DROP TABLE IF EXISTS `test`.`foo`;
CREATE TABLE  `test`.`foo` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `name` varchar(45) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Затем я пытаюсь получить записи на основе первичного ключа

SELECT * FROM foo f where f.id IN (2, 3, 1);

Затем я получаюследующий результат

+----+--------+
| id | name   |
+----+--------+
|  1 | first  |
|  2 | second |
|  3 | third  |
+----+--------+
3 rows in set (0.00 sec)

Как видно, результат упорядочен по id.Я пытаюсь добиться того, чтобы результаты были упорядочены в последовательности, которую я предоставляю в запросе.Учитывая этот пример, он должен вернуть

+----+--------+
| id | name   |
+----+--------+
|  2 | second |
|  3 | third  |
|  1 | first  |
+----+--------+
3 rows in set (0.00 sec)

Ответы [ 3 ]

0 голосов
/ 30 ноября 2018

Вы можете использовать производную таблицу с желаемыми идентификаторами и желаемым порядком, а затем присоединиться к таблице, что-то вроде ...

SELECT ...
FROM   mcscb.mcs_premise prem
JOIN   mcscb.mcs_serv_deliv_id serv 
  ON   prem.prem_nb = serv.prem_nb 
 AND   prem.tech_col_user_id = serv.tech_col_user_id 
 AND   prem.tech_col_version = serv.tech_col_version 
JOIN (
    SELECT 1, '9486154876' FROM SYSIBM.SYSDUMMY1 UNION ALL
    SELECT 2, '9403149581' FROM SYSIBM.SYSDUMMY1 UNION ALL
    SELECT 3, '9465828230' FROM SYSIBM.SYSDUMMY1 
) B (ORD, ID)
ON    serv.serv_deliv_id = B.ID
WHERE serv.tech_col_user_id = 'CRSSJEFF' 
  AND serv.tech_col_version = '00'
ORDER BY B.ORD
0 голосов
/ 30 ноября 2018

Чтобы сделать логику более очевидной, вы можете изменить решение , предоставленное bhamby , следующим образом:

WITH ordered_in_list (ord, id) as (
  VALUES (1, '9486154876'), (2, '9403149581'), (3, '9465828230')
)
SELECT ...
FROM   mcscb.mcs_premise prem
JOIN   mcscb.mcs_serv_deliv_id serv 
  ON   prem.prem_nb = serv.prem_nb 
 AND   prem.tech_col_user_id = serv.tech_col_user_id 
 AND   prem.tech_col_version = serv.tech_col_version 
JOIN   ordered_in_list il 
  ON   serv.serv_deliv_id = il.ID
WHERE serv.tech_col_user_id = 'CRSSJEFF' 
  AND serv.tech_col_version = '00'
ORDER BY il.ORD
0 голосов
/ 30 ноября 2018

Вы можете использовать производный столбец для выполнения пользовательского заказа.

select case when serv.SERV_DELIV_ID = '9486154876' then 1 ELSE when serv.SERV_DELIV_ID = '9403149581' then 2 ELSE 3 END END as custom_order, ... ... ORDER BY custom_order

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