【问题标题】:How to get latest version of a product from a jsonb array?如何从 jsonb 数组中获取最新版本的产品?
【发布时间】:2021-10-24 15:27:09
【问题描述】:

使用 PostgreSQL 12.7,我想从嵌套的 JSON 数组中获取产品的最新版本(最大值)。这是fields 列中product 'AAA' 的示例值:

 "customfield_01":[
      {
         "id":1303,
         "name":"AAA - 1.82.0",
         "state":"closed",
         "boardId":137,
         "endDate":"2021-10-15T10:00:00.000Z",
         "startDate":"2021-10-04T01:00:01.495Z",
         "completeDate":"2021-10-18T03:02:55.824Z"
      },
      {
         "id":1304,
         "name":"AAA - 1.83.0",
         "state":"active",
         "boardId":137,
         "endDate":"2021-10-29T10:00:00.000Z",
         "startDate":"2021-10-18T01:00:24.324Z"
      }
   ],

我试过了:

SELECT product, jsonb_path_query_array(fields, '$.customfield_01.version') AS version
FROM product.issues;

这是输出:

| product | version                                       |
|---------------------------------------------------------|
| CCC     |[]                                             |
| AAA     |["AAA - 1.83.0", "AAA - 1.82.0"]               |
| BBB     |["BBB - 1.83.0", "BBB - 1.82.0", "BBB - 1.84.0]|
| BBB     |["BBB - 1.83.0"]                               |
| BBB     |["BBB - 1.84.0", "BBB - 1.83.0"]               |

预期是:

| product | version                                       |
|---------------------------------------------------------|
| AAA     |["AAA - 1.83.0"                                |
| BBB     |["BBB - 1.84.0]                                |
| BBB     |["BBB - 1.83.0"]                               |
| BBB     |["BBB - 1.84.0"]                               |

尝试了 unnest/Array 但它抛出了一个错误:

SELECT max(version)
FROM  (SELECT UNNEST(ARRAY [jsonb_path_query_array(fields,'$.customfield_01.version')]) AS version FROM product.issues ) AS version;

确实使用了-1,但它只会获取最右边的数据。

jsonb_path_query_array(fields, '$.customfield_01.version') ->> -1

Postgres 和 json 非常新。确实尝试阅读文档和谷歌,但多次尝试失败。

【问题讨论】:

  • 请提供您的 input 值,并始终提供您的 Postgres 版本。
  • 谢谢。刚刚用输入值更新了帖子。
  • Select version();?
  • 正在研究如何获得它,谢谢!这是 PostgreSQL 12.7 的版本

标签: postgresql jsonb json-path-expression


【解决方案1】:

假设product 是您表的主键列。

可以使用SQL/JSON path 表达式:

SELECT product, max(version) AS latest_version
FROM   product.issues;
     , jsonb_array_elements_text(jsonb_path_query_array(fields, '$.customfield_01.name')) AS version 
GROUP  BY 1
ORDER  BY 1;

但是简单的jsonb 操作符可以达到同样的效果:

SELECT product, max(version ->> 'name') AS latest_version
FROM   product.issues
     , jsonb_array_elements(fields -> 'customfield_01') AS version
GROUP  BY 1
ORDER  BY 1;

使用jsonb_array_elements()jsonb_array_elements_text() 取消嵌套jsonb 数组。见:

unnest()(就像您尝试过的那样)可用于取消嵌套 Postgres 数组

当然,max() 仅在“最新版本”按字母顺序排在最后时才有效。否则,提取版本部分并将所有部分处理为数字。喜欢:

SELECT i.product, v.*
FROM   issues i
LEFT   JOIN LATERAL (
   SELECT version ->> 'name' AS version, string_to_array(split_part(version ->> 'name', ' - ', 2), '.')::int[] AS numeric_order
   FROM   jsonb_array_elements(i.fields -> 'customfield_01') AS version
   ORDER  BY 2 DESC NULLS LAST
   LIMIT  1
   ) v ON true;

db小提琴here

见:

【讨论】:

  • 为混乱道歉。让我重述一下。实际上我想获得该产品的最新版本。我在尝试 ERROR: cannot extract elements from a scalar 时遇到此错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-25
  • 1970-01-01
  • 1970-01-01
  • 2021-05-06
  • 1970-01-01
  • 2022-10-24
  • 2012-01-24
相关资源
最近更新 更多