Обновить несколько строк на основе упорядоченного массива - PullRequest
1 голос
/ 09 апреля 2020

У меня есть таблица, в которой есть столбец позиции pos для указания порядка отображения элементов в пользовательском интерфейсе:

|               list_has_task              |
|------------------------------------------|
| list_id (fk) | task_id (fk) | pos | meta |
| ------------ | ------------ | --- | ---- |
|         6969 |         1001 |  1  | abcd |
|         6969 |         1002 |  2  | efgh |
|         6969 |         1003 |  3  | ijkl |
|         6969 |         1004 |  4  | mnop |
|         6969 |         1005 |  5  | qrst |
                     (...)

Когда пользователь переупорядочивает список, я получаю упорядоченный список Идентификаторы в виде массива:

(1004,1003,1002,1005,1001)

Я хочу обновить эти строки в этом порядке.
Вот что у меня есть:

BEGIN;
   UPDATE list_has_task SET pos = 1 WHERE list_id = 6969 AND task_id = 1004;
   UPDATE list_has_task SET pos = 2 WHERE list_id = 6969 AND task_id = 1003;
   UPDATE list_has_task SET pos = 3 WHERE list_id = 6969 AND task_id = 1002;
   UPDATE list_has_task SET pos = 4 WHERE list_id = 6969 AND task_id = 1005;
   UPDATE list_has_task SET pos = 5 WHERE list_id = 6969 AND task_id = 1001;
COMMIT;

Есть ли Есть ли лучший способ сделать это?

Ответы [ 2 ]

2 голосов
/ 09 апреля 2020

Вы можете использовать мульти-таблицу UPDATE с таблицей VALUES:

UPDATE list_has_task AS l
SET pos = a.pos
FROM (VALUES (1, 1004), (2, 1003), (3, 1002), (4, 1005), (5, 1001)) AS a(pos, task_id)
WHERE l.task_id = a.task_id

Вывод:

list_id     task_id     pos     meta
6969        1004        1       mnop
6969        1003        2       ijkl
6969        1002        3       efgh
6969        1005        4       qrst
6969        1001        5       abcd

Демонстрация по SQLFiddle

1 голос
/ 09 апреля 2020

Я получаю упорядоченный список идентификаторов в виде массива.

Вы можете использовать это напрямую , unnest() и использовать WITH ORDINALITY функция:

UPDATE list_has_task l
SET    pos = x.ord
FROM   unnest('{1004,1003,1002,1005,1001}'::int[]) WITH ORDINALITY x(task_id, ord)
WHERE  l.list_id = 6969
AND    l.task_id = x.task_id;

дБ <> скрипка здесь

См .:

...