При выполнении рекурсивных действий рекомендуется принять дополнительные меры предосторожности, чтобы не допустить окончания какого-либо бесконечного цикла (которого надежно избегают только гуру, а я нет). Очевидно, что если это работает как нужно, это можно удалить. Однако это не так дорого, чтобы сделать это действительно необходимым. Если число ожидаемых строк больше, увеличьте значение или полностью удалите его, как только вы будете абсолютно уверены.
всех сил пытаюсь преобразовать
a | a1,a2,a3
b | b1,b3
c | c2,c1
чтобы:
a | a1
a | a2
a | a3
b | b1
b | b2
c | c2
c | c1
Вот данные в формате sql:
CREATE TABLE data(
"one" TEXT,
"many" TEXT
);
INSERT INTO "data" VALUES('a','a1,a2,a3');
INSERT INTO "data" VALUES('b','b1,b3');
INSERT INTO "data" VALUES('c','c2,c1');
Решение, вероятно, является рекурсивным выражением Common Table.
Вот пример, который делает что-то похожее на одну строку:
WITH RECURSIVE list( element, remainder ) AS (
SELECT NULL AS element, '1,2,3,4,5' AS remainder
UNION ALL
SELECT
CASE
WHEN INSTR( remainder, ',' )>0 THEN
SUBSTR( remainder, 0, INSTR( remainder, ',' ) )
ELSE
remainder
END AS element,
CASE
WHEN INSTR( remainder, ',' )>0 THEN
SUBSTR( remainder, INSTR( remainder, ',' )+1 )
ELSE
NULL
END AS remainder
FROM list
WHERE remainder IS NOT NULL
)
SELECT * FROM list;
(первоначально из этого сообщения в блоге:https://blog.expensify.com/2015/09/25/the-simplest-sqlite-common-table-expression-tutorial)
Это производит:
element | remainder
-------------------
NULL | 1,2,3,4,5
1 | 2,3,4,5
2 | 3,4,5
3 | 4,5
4 | 5
5 | NULL
проблема заключается в том, чтобы применить это к каждой строке таблицы.