SQL. Change values order in row

Допустим есть таблица, значение в row идут по порядку до null после которого все остольные тоже null:

id, col1, col2, col3, col4, lvl
 1,    a,    b,    c, null,   3
 2,    a,    b, null, null,   2
 3,    a,    b,    c,    d,   4

Нужно изменить порядок значений в колонках в первом row где id=1 значение col1>col3, col2>col2, col3>col1, col4>col4:

id, col1, col2, col3, col4, lvl
 1,    c,    b,    a, null,   3
 2,    b,    a, null, null,   2
 3,    d,    c,    b,    a,   4

может как то использовать динамеческие имена колонок с if:

select id, IF(col{1} < lvl, col+(lvl-col{1}), col1), ...

Ответы (1 шт):

Автор решения: Akina

Пример реализации для MySQL версии 8.0.4 и старше:

WITH 
cte1 AS (SELECT id, lvl, JSON_ARRAY(col1, col2, col3, col4) jsonarray
         FROM test),
cte2 AS (SELECT id, lvl, value, ROW_NUMBER() OVER (PARTITION BY id ORDER BY value DESC) rn
         FROM cte1
         CROSS JOIN JSON_TABLE( CAST(jsonarray AS CHAR),
                                "$[*]" COLUMNS( value VARCHAR(254) PATH "$" )
                              ) AS jsontable)
SELECT id, 
       MAX(CASE WHEN rn=1 THEN value END) col1,
       MAX(CASE WHEN rn=2 THEN value END) col2,
       MAX(CASE WHEN rn=3 THEN value END) col3,
       MAX(CASE WHEN rn=4 THEN value END) col4,
       lvl
FROM cte2
GROUP BY id, lvl
ORDER BY id;

fiddle

→ Ссылка