История изменений
Исправление Toxo2, (текущая версия) :
Если бы мне в одном предложении встретились слова «рекурсивно» и «таблица» - то первое, что пришло в голову было бы какое-то такое:
WITH RECURSIVE c_j AS (
SELECT
1 AS rn, ARRAY[p."key"] AS pk, p.value AS pv
FROM
json_each(pg_read_file('/tmp/package.json')::json) p
UNION ALL
SELECT
cj.rn + 1, array_append(pk, ch."key"), ch.value
FROM
c_j cj
LEFT JOIN json_each(CASE WHEN json_typeof(cj.pv) = 'object' THEN cj.pv END) ch ON TRUE
WHERE
json_typeof(cj.pv) = 'object'
)
SELECT * FROM c_j cj WHERE json_typeof(cj.pv) != 'object';
|rn |pk |pv |
|---|-----------------------------------|----------------------|
|1 |{private} |"true" |
|1 |{workspaces} |["packages/*"] |
|1 |{packageManager} |"yarn@1.22.22" |
|2 |{devDependencies,@babel/cli} |"^7.10.5" |
|2 |{devDependencies,@babel/code-frame}|"^7.10.4" |
...
Nushell умеет в какое-нибудь json_agg сам? Или хотя бы с плагинами Dataframe?
Исходная версия Toxo2, :
Если бы мне в одном предложении встретились слова «рекурсивно» и «таблица» - то первое, что пришло в голову было бы какое-то такое:
WITH RECURSIVE c_j AS (
SELECT
1 AS rn, ARRAY[p."key"] AS pk, p.value AS pv
FROM
json_each(pg_read_file('/tmp/package.json')::json) p
UNION ALL
SELECT
cj.rn + 1, array_append(pk, ch."key"), ch.value
FROM
c_j cj
LEFT JOIN json_each(CASE WHEN json_typeof(cj.pv) = 'object' THEN cj.pv END) ch ON TRUE
WHERE
json_typeof(cj.pv) = 'object'
)
SELECT * FROM c_j cj WHERE json_typeof(cj.pv) != 'object';
|rn |pk |pv |
|---|-----------------------------------|----------------------|
|1 |{private} |"true" |
|1 |{workspaces} |["packages/*"] |
|1 |{packageManager} |"yarn@1.22.22" |
|2 |{devDependencies,@babel/cli} |"^7.10.5" |
|2 |{devDependencies,@babel/code-frame}|"^7.10.4" |
...
Nushell умеет в какое-нибудь json_agg сам? Или хотя бы с плагинами Dataframe?