Postgresql 如何从包含数组的某个键的jsonb列中获取uniq数据?

Postgresql 如何从包含数组的某个键的jsonb列中获取uniq数据?,postgresql,Postgresql,我使用PostgreSQL 11.9,我的表product中有jsonb列,其中包含键大小,我的目标是在所有products表中获得所有唯一的可用大小,查询应该是什么样子 现在我有这个,但这是每一个产品的行,我希望每一行对于整个数据库,所有的产品,都是唯一的大小 我所拥有的 SELECT DISTINCT sub.SIZE FROM ( SELECT jsonb_build_object('SIZE', p.extras->'SIZE') AS SIZE FROM products AS

我使用PostgreSQL 11.9,我的表product中有jsonb列,其中包含键大小,我的目标是在所有products表中获得所有唯一的可用大小,查询应该是什么样子

现在我有这个,但这是每一个产品的行,我希望每一行对于整个数据库,所有的产品,都是唯一的大小

我所拥有的

SELECT DISTINCT sub.SIZE FROM (

SELECT
jsonb_build_object('SIZE', p.extras->'SIZE') AS SIZE
FROM products AS p
WHERE p.extras IS NOT NULL
) sub
WHERE sub.SIZE != '{"SIZE": null}';
我的结果呢

{"SIZE": ["32", "34", "36", "38", "52", "54", "48", "50", "40", "42", "44", "46", "32/34,36/38,52/54,48/50,40/42,44/46"]}
{"SIZE": ["38", "40", "42", "46", "48", "50", "52", "38,40,42,46,48,50,52"]}
{"SIZE": ["270", "150", "270x150cm"]}
{"SIZE": ["30", "33", "30-33"]}
{"SIZE": ["13", "5", "32", "US13.5 / EU32"]}
{"SIZE": ["3", "3 years"]}
{"SIZE": ["25", "5", "40", "25.5 / EU40"]}
{"SIZE": ["6", "23", "US6 / EU23"]}
此示例在单独的行结果中包含大小38,考虑到这是重复的,将是uniq数据的结果。我期待这样的结果

["38", "40" .....]

这是产品行中的示例
extra
列<代码>额外列的类型为jsonb

{"SIZE": ["3", "5", "3.5"], "COLOUR": "Vit", "CONDITION": "new", "OWN_COLOUR": "Vit"}
大小键这是数组

已更新 已解决

谢谢大家,ritgh现在有两种方法来解决这个问题,结果中有相同的结果1154行,但在一个查询中存在不同的结果,在另一个查询中不存在不同的结果,并且结果相同,但是在所有产品中存在大量重复的大小,如何可能,
jsonb_数组_元素
默认生成uniq结果

select distinct x.size
from products p
cross join lateral jsonb_array_elements_text(p.extras -> 'SIZE') as x(size)

select jsonb_array_elements(p.extras -> 'SIZE') as type
from products AS p
group by type
我想你只是想:

select distinct extras ->> 'SIZE' size
from products
如果需要,可以在
where
子句中实现过滤逻辑。也许:

select distinct extras ->> 'SIZE' size
from products
where extras ->> 'SIZE' is not null
另一方面,如果json属性
SIZE
是一个数组,那么我们需要首先取消对它的测试:

select distinct x.size
from products p
cross join lateral jsonb_array_elements_text(t.extras -> 'SIZE') as x(size)

不,因为这个查询返回每个orw的数据,但我需要全局的uniq数据在整个数据中包含什么base@shuba.ivan:
select distinct
仅提供唯一值。结果示例
[“36”、“38”、“52”、“54”、“40”、“42”、“44”、“46”、“32”、“34”、“48”、“50”、“36/38,52/54,40/42,44/46,32/34,48/50”][“2”、“34”、“US2/EU34”]
我不知道;我不需要这个,“34”duplicated@shuba.ivan:好的,看起来
SIZE
是一个数组。请参阅我的更新。
从产品中选择不同的x.size p交叉连接横向jsonb_数组_元素_文本(p.extras->>“size”)作为x(size)>错误:函数jsonb_数组_元素_文本(文本)不存在第3行:交叉连接横向jsonb_数组_元素_文本(p.extras->S…^提示:没有函数与给定的名称和参数类型匹配。您可能需要添加显式类型转换。>时间:0.085s
我不明白您想要的输出是什么。每个产品具有唯一大小的数组?或者只是所有产品中唯一大小的列表?确切地说-唯一大小所有产品。我更新问题
select distinct x.size
from products p
cross join lateral jsonb_array_elements_text(t.extras -> 'SIZE') as x(size)