如何使用postgresql的ANY在动态查询中访问多维数组
How use postgresql's ANY to access multidimensional array in dynamic query
我用多维数组调用 postgres 函数,如下所示:
SELECT get_listings(ARRAY[['name:John','grade:1'],['id:5','year:2020']]);
postgresql 函数具有以下签名:
CREATE FUNCTION get_listings(arr text[]) RETURNS TABLE
(
id text,
tagz text
)
在函数内部我构造了一个循环语句:
select * from (select product_type_id, string_agg(tag, '','') as tags
from all_tags group by product_type_id) as a
where tags = any([0]) and tags = any([1])
赋值给变量stmt
;
现在我打电话给
RETURN QUERY EXECUTE stmt using arrArgs;
其中 arrArgs
之前已分配 arr
;
我收到这个错误:
ERROR: op ANY/ALL (array) requires array on right side
如何在 any
函数调用中访问内部数组?
PostgreSQL 具有最好和最简单的函数 unnest()
用于将数组元素扩展为一组行。例如:
SELECT unnest(array[['tagA','tagB'],['tagA','tagB']]);
Result:
unnest
----------
| tagA |
| tagB |
| tagC |
| tagD |
然后您可以在 where
语句上使用任何条件。
select main.* from
(
SELECT unnest(array[['tagA','tagB'],['tagA','tagB']]) as array_data
) main
where main.array_data in ('tagA', 'tagD');
Result:
array_data
--------------
| tagA |
| tagD |
我用多维数组调用 postgres 函数,如下所示:
SELECT get_listings(ARRAY[['name:John','grade:1'],['id:5','year:2020']]);
postgresql 函数具有以下签名:
CREATE FUNCTION get_listings(arr text[]) RETURNS TABLE
(
id text,
tagz text
)
在函数内部我构造了一个循环语句:
select * from (select product_type_id, string_agg(tag, '','') as tags
from all_tags group by product_type_id) as a
where tags = any([0]) and tags = any([1])
赋值给变量stmt
;
现在我打电话给
RETURN QUERY EXECUTE stmt using arrArgs;
其中 arrArgs
之前已分配 arr
;
我收到这个错误:
ERROR: op ANY/ALL (array) requires array on right side
如何在 any
函数调用中访问内部数组?
PostgreSQL 具有最好和最简单的函数 unnest()
用于将数组元素扩展为一组行。例如:
SELECT unnest(array[['tagA','tagB'],['tagA','tagB']]);
Result:
unnest
----------
| tagA |
| tagB |
| tagC |
| tagD |
然后您可以在 where
语句上使用任何条件。
select main.* from
(
SELECT unnest(array[['tagA','tagB'],['tagA','tagB']]) as array_data
) main
where main.array_data in ('tagA', 'tagD');
Result:
array_data
--------------
| tagA |
| tagD |