如何从 jsonb 字段中转换文本项列表以按 uuid 类型的字段执行 IN 子句?
How to cast list of text items from jsonb field to perform IN clause by field of type uuid?
foo
table 具有以下字段:
- uuid 类型为 uuid
- info 类型为 jsonb
除其他外,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。
SELECT
elements::int AS uuid
FROM
foo,
jsonb_array_elements_text(info -> 'bar') elements
WHERE uuid = 4
如果你想要整条记录:
SELECT
*
FROM foo
WHERE uuid IN (
SELECT
elements::int
FROM
foo,
jsonb_array_elements_text(info -> 'bar') elements
WHERE uuid = 4
)
foo
table 具有以下字段:
- uuid 类型为 uuid
- info 类型为 jsonb
除其他外,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。
SELECT
elements::int AS uuid
FROM
foo,
jsonb_array_elements_text(info -> 'bar') elements
WHERE uuid = 4
如果你想要整条记录:
SELECT
*
FROM foo
WHERE uuid IN (
SELECT
elements::int
FROM
foo,
jsonb_array_elements_text(info -> 'bar') elements
WHERE uuid = 4
)