【问题标题】:Is there a way in Postgresql to query the entire JSONB record in a column?Postgresql 中有没有办法查询列中的整个 JSONB 记录?
【发布时间】:2021-02-14 03:18:46
【问题描述】:

我将 Postgresql 13 / express.js 与 node-postgres 一起用于测试项目。我在 Postgresql 中有一个表,其中包含一个列,其中包含评估表的一系列问题(我将其设为 JSON,因为可以编辑问题以包含更多或更少的问题,动态表单内容)。

有了这个想法,我做了两张表:EvalFormDefaultForm

EvalForm 拥有id (PK, INT), job_id, form_type (INT), form_questions (JSONB), and form_answers (JSONB)

DefaultForm 拥有id (PK, INT) and form_questions(JSONB)

逻辑是form_type 值将对应于将基于其id 复制的form_questions。 (例如form_type = 1,那么它将从DefaultForm 表中复制id = 1 的form_questions。

我希望能够复制整个 JSONB 数组并将其插入到另一个表中。我已经阅读了有关 jsonb_build_objectjsonb_agg() 的信息,但我不确定如何将它们用于我的用例。

提前感谢您的帮助!

这是我目前正在处理的查询,只是缺少如何获取 JSONB,因为我无法将类型记录转换为 JSONB。

const type = await pool.query('SELECT job_type FROM jobs WHERE id = $1', [
  req.params.id
]);

 const sqlString = 'WITH questions AS (
 SELECT form_questions
FROM DefaultForm WHERE id = $2
 INSERT INTO EvalForm (
job_id, form_type, form_questions)
  SELECT $1, $2, questions::jsonb
FROM questions';

 const sqlValues = [req.params.id, type.rows[0].job_type
 ];

【问题讨论】:

  • 你为什么要复制这些问题(而不是仅仅引用它们)?
  • @Bergie 因为 DefaultForm 可以更改/更新,并且在将来引用它们会导致不一致(例如,目前 DefaultForm 中有 6 个问题,这使得它需要在 EvalForm 中有 6 个答案。将来,如果用户决定更改问题、减少或增加问题数量,则 EvalForm 行将自行更新为新的 DefaultForm,这是我想避免的。)

标签: postgresql


【解决方案1】:

jsonb_agg 是正确的选择,您正在寻找

INSERT INTO EvalForm (job_id, form_type, form_questions)
SELECT $1, $2, jsonb_agg(form_questions)
FROM DefaultForm
WHERE id = $2;

【讨论】:

    猜你喜欢
    • 2021-10-15
    • 2022-01-18
    • 1970-01-01
    • 2015-03-13
    • 1970-01-01
    • 2020-10-19
    • 1970-01-01
    • 2021-11-28
    • 2012-10-30
    相关资源
    最近更新 更多