В SQLite вы можете использовать рекурсивное общее табличное выражение для решения этой проблемы. Рекурсивный CTE выбирает из исходной таблицы и разбивает строки на части, из которых выбирает основной запрос.
WITH RECURSIVE cte(id, val, etc) AS(
SELECT id_a, '', str_ids FROM arche
UNION ALL
SELECT
id
, SUBSTR(etc, 0, INSTR(etc, '#'))
, SUBSTR(etc, INSTR(etc, '#')+1)
FROM cte
WHERE etc <> ''
)
SELECT id AS id_a, REPLACE(val, 'id', '') AS id_b
FROM cte
WHERE val <> ''
ORDER BY id, val
Вот пример:
Схема (SQLite v3.26)
Запрос № 1 [1113 ]
WITH RECURSIVE cte(id, val, etc) AS(
SELECT 1, '', '#id1#id2#id4#id7#'
UNION ALL
SELECT
id
, SUBSTR(etc, 0, INSTR(etc, '#'))
, SUBSTR(etc, INSTR(etc, '#')+1)
FROM cte
WHERE etc <> ''
)
SELECT id AS id_a, val AS id_b
FROM cte
WHERE val <> ''
ORDER BY id, val;
| id_a | id_b | | ---- | ---- | | 1 | id1 | | 1 | id2 | | 1 | id4 | | 1 | id7 |
NB2:
REGEXP_REPLACE
не существует в SQLite, я заменил его на REPLACE
, вам нужно #
объявление конца строки, чтобы это работало (наличие двух # `тоже нормально)
это не очень эффективный подход; если вам нужно обработать много строк, это может плохо масштабироваться.
Можно оставить один конец части открытым, не определив значение.
test[3:] = [3, 4, 5, 6, 7, 8, 9]
test[:3] = [0, 1, 2]
Если Вы используете переменную в качестве конечной точки диапазона, можно использовать None
.
start = 4
end = None
test[start:end]