Postgres json列有版本,返回最旧的版本

yzuktlbb  于 2022-12-01  发布在  其他
关注(0)|答案(1)|浏览(138)

我有下表:

create table subscriptions (id int, data jsonb);

填写以下数据:

insert into subscriptions (id, data) 
values 
  (1, '{"versions": {"10.2.3": 3, "9.2.3": 4, "12.2.3": 5, "1.2.3": 5}}'),
  (2, '{"versions": {"0.2.3": 3, "2.2.3": 4, "3.2.3": 5}}');

我正在尝试编写一个查询,它将导致:

-----------------
| id | minVersion |
 -----------------
| 1  | 1.2.3      |
| 2  | 0.2.3      |
 -----------------

我尝试过的方法:

select
      (string_to_array(jsonb_object_keys((data->'versions')::jsonb), '.'))[1] as total_prices
from subscriptions;

(does不起作用,但我认为这些方法在这里会很有用)

0s0u357o

0s0u357o1#

我会创建一个函数来提取版本密钥,并对它们进行排序以选择最小的密钥。

create or replace function smallest_version(p_version jsonb)
  returns text
as
$$
  select version
  from jsonb_each_text(p_version) as x(version, num)
  order by string_to_array(x.version, '.')::int[]
  limit 1
$$
language sql
immutable;

只有在版本号中没有1.2.3-beta或其他非数字字符时,上述操作才有效。
然后按如下方式使用它:

select smallest_version(data->'versions')
from subscriptions;

Online example

相关问题