如何从 jsonb 字段中转换文本项列表以按 uuid 类型的字段执行 IN 子句?

How to cast list of text items from jsonb field to perform IN clause by field of type uuid?

foo table 具有以下字段:

除其他外,info 字段包含 bar 键和来自相同 table(foo) 的 uuid 列表。现在我需要 select 所有 foo 条目,其中 uuid 在 info->'bar' 列表中的某些特定条目。我尝试了下面的 select 查询并得到了 operator does not exist: uuid = uuid[] 错误

SELECT uuid 
FROM foo 
WHERE uuid IN (SELECT jsonb_array_to_text_array(info->'bar')::uuid[] 
               FROM foo 
               WHERE uuid='some_uuid');

我需要如何修改查询才能执行此操作?我没主意了

no such function named jsonb_array_to_text_array

但是您可以使用 jsonb_array_elements_text() 函数,它将每个数组元素扩展为一行。有了这个结果,您就可以按它们进行过滤以找到 uuid。

demo:db<>fiddle

SELECT
    elements::int AS uuid
FROM
    foo,
    jsonb_array_elements_text(info -> 'bar') elements
WHERE uuid = 4  

如果你想要整条记录:

demo:db<>fiddle

SELECT 
    *
FROM foo
WHERE uuid IN (
    SELECT
        elements::int
    FROM
        foo,
        jsonb_array_elements_text(info -> 'bar') elements
    WHERE uuid = 4  
)