Имеется таблица. Пусть будет 10 полей. Идентификатор первичный ключ и 9 полей с одинаковым типом (пусть varchar).
Эти 9 полей случайно заполнены произвольными значениями и null-ами.
Требуется в каждой записи сдвинуть поля со значениями максимально влево, а с null-ами соответственно вправо.
Для СУБД postgres v12
Как насчёт "путём отрывания рук тому, кто придумал такую схему"? ;( Ну вот так, например: WITH x (id, f1, f2, f3, f4, f5, f6, f7, f8, f9) AS ( VALUES (1, NULL, 'test', NULL, 'test1', 'test3', NULL, NULL, 'test4', 'test5'), (2, NULL, NULL, 'test', 'test1', NULL, 'test3', NULL, NULL, NULL) ) SELECT x.*, a.s[1] AS g1, a.s[2] AS g2, a.s[3] AS g3, a.s[4] AS g4, a.s[5] AS g5, a.s[6] AS g6, a.s[7] AS g7, a.s[8] AS g8, a.s[9] AS g9 FROM x CROSS JOIN LATERAL ( SELECT array_agg(u.e ORDER BY u.n) FILTER (WHERE u.e IS NOT NULL) AS s FROM unnest(ARRAY[x.f1, x.f2, x.f3, x.f4, x.f5, x.f6, x.f7, x.f8, x.f9]) WITH ORDINALITY AS u(e, n) ) AS a;
Обсуждают сегодня