是否可以使用 PostgreSQL 在 json 文档中选择不同的值?

Tra*_*lio 7 postgresql json greatest-n-per-group

我有一个使用 JSON 类型的列。我想执行查询以选择 JSON 字符串中特定字段的所有不同记录:即给定这三个文档

{
  id: 1,
  s: "foo"
},
{
  id:2,
  s: "bar"
},
{
  id:3,
  s: "foo"
},
Run Code Online (Sandbox Code Playgroud)

查询必须检查“s”键是否有不同的值,并返回 ID 为 1 和 2 的文档。

Erw*_*ter 12

假设Postgres 9.4列中有一个JSON 数组,这将完成这项工作: jsonb

SELECT DISTINCT ON (doc->'s') doc
FROM  (
   SELECT '[
    {
      "id":1,
      "s":"foo"
    },
    {
      "id":2,
      "s":"bar"
    },
    {
      "id":3,
      "s":"foo"
    }]'::jsonb AS j
   ) t
   , jsonb_array_elements(t.j) WITH ORDINALITY t1(doc, rn)
ORDER  BY doc->'s', rn;
Run Code Online (Sandbox Code Playgroud)

或者,除非s是嵌套对象,否则折叠text 而不是jsonb(子)记录可能更便宜。只需使用运营商 ->>,而不是->在这种情况下。结果是一样的:

 doc
----------------------
'{"s": "bar", "id": 2}'
'{"s": "foo", "id": 1}'
Run Code Online (Sandbox Code Playgroud)

t用您的实际表替换子查询。

关键元素是jsonb_array_elements()(或json_array_elements()LATERALWITH ORDINALITYPostgres 特定的DISTINCT ON.

相关,有更多解释: