postgresql - Postgresql 中有没有办法查询列中的整个 JSONB 记录?
问题描述
我正在将 Postgresql 13 / express.js 与 node-postgres 一起用于测试项目。我在 Postgresql 中有一个表,其中包含一个列,其中包含评估表的一系列问题(我将其设置为 JSON,因为可以编辑问题以包含更多或更少的问题,动态表单内容)。
有了这个想法,我做了两张桌子:EvalForm
和DefaultForm
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
值将对应于form_questions
将根据其复制的内容id
。(例如form_type
= 1,那么它将id
从DefaultForm
表中复制 = 1 的 form_questions)。
我希望能够复制整个 JSONB 数组并将其插入到另一个表中。我已经阅读了jsonb_build_object
and jsonb_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
];
解决方案
jsonb_agg
是正确的选择,您正在寻找
INSERT INTO EvalForm (job_id, form_type, form_questions)
SELECT $1, $2, jsonb_agg(form_questions)
FROM DefaultForm
WHERE id = $2;
推荐阅读
- ruby-on-rails - 如何在测试中运行方法
- pyspark - 如何使用 pyspark 将数值转换为分类变量
- reactjs - 在 reactjs 中播放 DOM 的正确或标准方式
- c# - c#改变datagrid单元格颜色
- angular - 角度 6 中的可扩展行,具有角度材料,具有作为父行的确切列
- c++ - 如何加快正则表达式在 C++ 中搜索大量潜在大文件的速度?
- api-key - 需要为不同的应用程序生成 API 密钥
- spring - 有没有办法用选项菜单中断登录
- listlabel - 与 .NET Framework 3.5 的兼容性
- hive - 过滤计数(*)超过一定数量?