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;