Sqlite JSON1中三元组到对象表的转换

xmjla07d  于 2023-01-05  发布在  SQLite
关注(0)|答案(1)|浏览(92)

我有一个Sqlite表triples,其中包含{ id, rel, tgt }的三重信息[1]。我想创建一个视图,将这种三重格式的数据公开为"对象格式",这更容易被从该数据库读取的应用程序使用。理论上,sqlite的JSON1扩展允许我构造这样的对象,但我在努力。
我的当前查询

select distinct json_object(
  'id', id,
  rel, json_group_array(distinct tgt)
) as entity from content
group by src, rel, tgt
order by src, rel, tgt

无法正常工作。它会生成如下对象

{ id: 'a', 'is': ['b'] }
{ id: 'a', 'is': ['c'] }

而不是

{ id: 'a', 'is': ['b', 'c'] }

它还会生成重复的键,如

{ id: 'a', id: ['a'] }

* 编辑 *

这更接近,但不能正确处理ID。它构造一个数组,而不是字符串

create view if not exists entity as
  select distinct json_group_object(
    rel, json_array(distinct tgt)
  ) as entity from content
  group by src

我想iif可能会有帮助
问题;
你能帮我调整我的查询,以产生正确的输出(见下文)?请评论,如果有任何需要消除歧义或澄清

预期输出

输入:

    • 三重格式**:
id   | rel   | tgt
-----------------------
Bob   | is     | Bob
Bob   | is     | Person
Bob   | age    | 20
Bob   | likes  | cake
Bob   | likes  | chocolate
Alice | id     | Alice
Alice | is     | Person
Alice | hates  | chocolate

输出:

    • 对象格式**[2]:
{
  id:    Bob,
  is:    [ Person ],
  age:   [ 20 ],
  likes: [ cake, chocolate ]
}

{
  id:    Alice,
  is:    [ Person ],
  hates: [ chocolate ]
}

详情

[1]此数据集具有不可预测的结构;我可以假设没有关于id之外存在什么"rel"键的先验知识。对于每个src参数,将存在一个三元组<src> id <src>
[2]对象应具有以下格式。id不能被覆盖。

{ 
  id: <id>
  <distinct rel>: [ 
    < tgt >
  ]
}

相关信息

zhte4eai

zhte4eai1#

CREATE TABLE content (
  id    VARCHAR(32),
  rel   VARCHAR(32),
  tgt   VARCHAR(32)
);
INSERT INTO
  content
VALUES
  ('Bob'  , 'id'   , 'Bob'),
  ('Bob'  , 'is'   , 'Person'),
  ('Bob'  , 'age'  , '20'),
  ('Bob'  , 'likes', 'cake'),
  ('Bob'  , 'likes', 'chocolate'),
  ('Alice', 'id'   , 'Alice'),
  ('Alice', 'is'   , 'Person'),
  ('Alice', 'hates', 'chocolate')
WITH
  id_rel AS
(
  SELECT
    id,
    rel,
    JSON_GROUP_ARRAY(tgt)  AS tgt
  FROM
    content
  GROUP BY
    id,
    rel
)
SELECT
  JSON_GROUP_OBJECT(
    rel,
    CASE WHEN rel='id'
         THEN JSON(tgt)->0
         ELSE JSON(tgt)
    END
  )
    AS entity
FROM
  id_rel
GROUP BY
  id
ORDER BY
  id

| 实体|
| - ------|
| {“讨厌”:[“巧克力”],“身份”:“爱丽丝”,“是”:[“人”]}|
| {“年龄”:[“20”],“身份证”:“鲍勃”,“是”:[“人”],“喜欢”:[“蛋糕”,“巧克力”]}|
fiddle
您***必须***在两个步骤中进行聚合,因为您编辑的代码***不会***将cakechocolate合并到一个包含两个元素的数组中...

相关问题