运营商

时间:2017-06-14 08:31:56

标签: postgresql stored-procedures

我使用postgres 9.3。 什么从函数返回到" IN"操作

这是我的功能:

CREATE FUNCTION array_lowercase(args text[]) RETURNS TABLE (t text ) AS
  $BODY$
  SELECT btrim(lower(unnest(args)))::text AS tag
  $BODY$
language sql IMMUTABLE;

结果是:

select array_lowercase(array['  AdaPterKiNd  ','  ResoUrceKinD ']);
 array_lowercase
-----------------
 adapterkind
 resourcekind
(2 rows)

但是当我试图在" IN"中使用该功能时运营商发出错误消息:

select * from hd_property where lower(property_name) in (array_lowercase(array['  AdaPterKiNd  ','  ResoUrceKinD ']));
ERROR:  argument of IN must not return a set
LINE 1: select * from hd_property where lower(property_name) in (arr...
                                        ^

在" IN"中使用相同的子查询。 operator(没有调用函数)工作正常:

select * from hd_property where lower(property_name) in ( SELECT btrim(lower(unnest(array['  AdaPterKiNd  ','  ResoUrceKinD '])))::text);
             property_id              | property_name | property_category_id | property_type_id
--------------------------------------+---------------+----------------------+------------------
 aea66c83-fe9f-3729-c3b7-1d000c9866cb | AdapterKind   |                    2 |                1
 cbaf50eb-4b4b-39eb-d769-4737c9715019 | ResourceKind  |                    2 |                1
(2 rows)

从" IN"中使用的函数返回什么?操作

1 个答案:

答案 0 :(得分:1)

必须像表一样使用返回表的函数。

select * 
from hd_property 
where lower(property_name) in (select t 
                               from array_lowercase(array['  AdaPterKiNd  ','  ResoUrceKinD ']));