我有一个SQLite表,其中一列包含一个JSON数组,该数组包含0个或多个值。大概是这样的:
id|values
0 |[1,2,3]
1 |[]
2 |[2,3,4]
3 |[2]
我想做的是将其“展开”为该列的数组中包含的所有不同值的列表。
首先,我使用JSON1扩展的json_each函数从一行中提取一个值表:
SELECT
value
FROM
json_each(
(
SELECT
values
FROM
my_table
WHERE
id == 2
)
)
在这里我可以改变id(上面的2)来选择表中的任何一行。
现在,我尝试将其 Package 在递归CTE中,以便可以将其应用于整个表中的每一行并合并结果。作为第一步,我大致复制了上面的结果如下:
WITH RECURSIVE result AS (
SELECT null
UNION ALL
SELECT
value
FROM
json_each(
(
SELECT
values
FROM
my_table
WHERE
id == 2
)
)
)
SELECT * FROM result;
下一步,我原本计划让id成为一个变量并递增它(以类似于文档中第一个示例的方式,但还没有能够让它工作。
我已经浏览了文档中的其他示例,但是它们有点复杂,我还没有能够提炼出它们来看看它们如何应用于这个问题。
有人能提供一个简单的例子,说明如何用递归CTE解决这个问题(或类似的问题)吗?
当然,我的目标是解决这个问题,无论有没有CTE,所以我也很高兴听到是否有更好的方法。
2条答案
按热度按时间yvgpqqbh1#
您不需要为此使用递归CTE。
要为多个源行调用
json_each
,请使用联接:jvlzgdj92#
我也遇到过类似的问题。在我的例子中,输入是json格式的pmd报告(使用格式
-f json
),它像这样嵌套多次数组
files: []
中的每个文件[f1, f2]
可以有n个违规[v1, v2, v3]
我用来提取json对象和一些属性的SQL如下所示
使用公共表表达式
使用子查询
分解
json_each(PMD_Reports.format_json, '$.files')
对files-array
进行解包,结果是每个文件一行。json_each(T1.Files, '$.violations')
解包每个文件的每个违规json_extract(T2.value, '$.priority') as priority,
读取违规的属性priority
(T2.value
包含违规对象)