【问题标题】:Recursive SQLite CTE with JSON1 json_each带有 JSON1 json_each 的递归 SQLite CTE
【发布时间】:2017-06-29 09:21:43
【问题描述】:

我有一个 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)来选择表格中的任何行。

现在,我正在尝试将其包装在递归 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 的问题,所以我也很高兴听到是否有更好的方法......

【问题讨论】:

    标签: sqlite recursion common-table-expression


    【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-07
      • 2019-12-25
      • 1970-01-01
      • 2021-10-19
      相关资源
      最近更新 更多