【问题标题】:Using Postgres JSON Functions on a table row在表行上使用 Postgres JSON 函数
【发布时间】:2021-07-10 06:27:45
【问题描述】:

我对此感到困惑,所以也许有人可以帮助我。我有一个包含两列 id 和 json_data 的表“答案”。在 json_data 列的每一行中,我保存了如下所示的对象数据:

第一个 json_data 行:

{
    "question161839": {"answer": "test1 answer", "review_answ": "true"}, 
    "question161840": {"answer": "test2 answer", "review_answ": "false"}, 
    "question161841": {"answer": "test3 answer", "review_answ": "true"}, 
}

下一个 json_data 行:

{
    "question161850": {"answer": "test4 answer", "review_answ": "true"}, 
    "question161851": {"answer": "test5 answer", "review_answ": "true"}, 
    "question161852": {"answer": "test6 answer", "review_answ": "false"}, 
    "question161853": {"answer": "test7 answer", "review_answ": "false"}
}

我正在寻找 Postgres 查询,它允许我选择“review_answ”为假的问题。 比如:

select * from answers where json_data->review_answ = false

我期待的结果是:

question161840, question161852, question161853

我发现了一个类似的问题here,但我不明白如何在我的情况下使用它。

【问题讨论】:

  • 您想要多行还是单行的结果?您使用的是哪个 Postgres 版本?
  • 如果可能的话,我会更喜欢多行并且我使用的是 Postgres 11.8

标签: sql arrays json postgresql


【解决方案1】:

您可以使用jsonb_each() 提取所有键/值对,结果可以使用 WHERE 条件进行过滤:

select a.id, t.questionid
from answers a
  cross join jsonb_each(a.json_data) t(questionid, details)
where t.details ->> 'review_answ' = 'false'
order by a.id;

如果您的列被定义为json 而不是jsonb(应该是),则需要改用json_each()

Online example

【讨论】:

    【解决方案2】:

    可能是这样的:

    select substring(json_data::TEXT,4,14) from answers where json_data ->> review_answ = false

    【讨论】:

    • 谢谢,但不,它不起作用:查询 1 错误:错误:列“review_answ”不存在
    • 你只需要改变这样的条件: SELECT substring(json_data::TEXT,4,14) FROM answers WHERE json_data::TEXT LIKE '%"review_answ": "false"%'
    • 感谢您的帮助 - 此解决方案也有效!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    • 2017-05-20
    • 1970-01-01
    • 1970-01-01
    • 2017-04-09
    相关资源
    最近更新 更多