使用JSON1 json_each的递归SQLite CTE

时间:2017-06-29 09:21:44

标签: sqlite recursion common-table-expression

我有一个SQLite表,其中一列包含一个包含0或更多值的JSON数组。像这样:

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)以选择表格中的任何行。

现在,我试图将它包装在递归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设为变量并递增它(与documentation中的第一个示例类似,但无法使其工作。

我已经阅读了文档中的其他示例,但它们有点复杂,我无法提炼出来,看看它们如何应用于此问题。

有人可以提供一个简单的示例,说明如何使用递归CTE解决此问题(或类似问题)吗?

当然,我的目标是在有或没有CTE的情况下解决问题所以我也很高兴听到是否有更好的方法......

1 个答案:

答案 0 :(得分:1)

您不需要递归CTE。

要为多个源行调用json_each,请使用连接:

SELECT t1.id, t2.value
FROM my_table AS t1
JOIN json_each((SELECT "values" FROM my_table WHERE id = t1.id)) AS t2;