使用动态自定义字段类型字段进行查询
Query with a dynamic custom field type field
自定义字段类型参数应该是动态的我的代码如下所示:
create or replace function somefunc(ip_address varchar, ip_type varchar)
returns table(fielda varchar,
fieldb varchar,
language plpgsql
as $$
begin
return query
execute format('select fielda,
fieldb,
from
ips
join
names on id = other_id
where
iprange >>= ip_address::%s', ip_type);
end;
$$
如您所见,我尝试使用格式,但它认为 ip_address 是一列。
format 应该是 %s
(简单字符串)而不是 %I
(标识符)
这是一个演示,将字母 a
与 1
和自定义演员表连接起来:
create or replace function somefunc(ip_type varchar)
returns setof text
language plpgsql
as $$
begin
return query
execute format('select ''a''||1::%s', ip_type);
end;
$$;
select somefunc('text');
somefunc
----------
a1
(1 row)
select somefunc('bool');
somefunc
----------
atrue
(1 row)
并在您的原始函数中:
create or replace function somefunc(ip_address varchar, ip_type varchar)
returns table(fielda varchar,
fieldb varchar,
language plpgsql
as $$
begin
return query
execute format('select fielda,
fieldb
from
ips
join
names on id = other_id
where
iprange >>= ip_address::%s', ip_type);
end;
$$
自定义字段类型参数应该是动态的我的代码如下所示:
create or replace function somefunc(ip_address varchar, ip_type varchar)
returns table(fielda varchar,
fieldb varchar,
language plpgsql
as $$
begin
return query
execute format('select fielda,
fieldb,
from
ips
join
names on id = other_id
where
iprange >>= ip_address::%s', ip_type);
end;
$$
如您所见,我尝试使用格式,但它认为 ip_address 是一列。
format 应该是 %s
(简单字符串)而不是 %I
(标识符)
这是一个演示,将字母 a
与 1
和自定义演员表连接起来:
create or replace function somefunc(ip_type varchar)
returns setof text
language plpgsql
as $$
begin
return query
execute format('select ''a''||1::%s', ip_type);
end;
$$;
select somefunc('text');
somefunc
----------
a1
(1 row)
select somefunc('bool');
somefunc
----------
atrue
(1 row)
并在您的原始函数中:
create or replace function somefunc(ip_address varchar, ip_type varchar)
returns table(fielda varchar,
fieldb varchar,
language plpgsql
as $$
begin
return query
execute format('select fielda,
fieldb
from
ips
join
names on id = other_id
where
iprange >>= ip_address::%s', ip_type);
end;
$$