PostgreSQL:获取<;空>;通过将空值传递给函数来创建字符串
我有以下带有一个参数的函数。我需要显示一个字符串,它由PostgreSQL:获取<;空>;通过将空值传递给函数来创建字符串,postgresql,Postgresql,我有以下带有一个参数的函数。我需要显示一个字符串,它由select语句和where条件组成 示例: create or replace function funct(a int) returns void as $$ declare wrclause varchar := ''; sqlq varchar ; t varchar; begin wrclause := ' AND C IN ('|| a || ')'; sql
select
语句和where
条件组成
示例:
create or replace function funct(a int)
returns void as
$$
declare
wrclause varchar := '';
sqlq varchar ;
t varchar;
begin
wrclause := ' AND C IN ('|| a || ')';
sqlq := ' t :=select string_agg(''select *, abcd as "D" from '' || table_namess ||, '' Union all '') as namess
from tablescollection2 ud
inner join INFORMATION_SCHEMA.Tables so on ud.table_namess = so.Table_name where C = '|| a ||'' || wrclause;
raise info '%',sqlq;
perform sqlq;
raise info '%',t;
end;
$$
language plpgsql;
调用函数:值为1
select funct(1);
输出:
INFO: t :=select string_agg('select *, abcd as "D" from ' || table_namess ||, ' Union all ') as namess
from tablescollection2 ud
inner join INFORMATION_SCHEMA.Tables so on ud.table_namess = so.Table_name where C = 1 AND C IN (1)
INFO: <NULL>
输出:
INFO: <NULL>
INFO: <NULL>
信息:
信息:
注意:在将空字符串分配给
wrclause
变量后,我没有得到为什么我会得到
字符串以及
变量t
如果满足您对NULL的所有要求,您可以尝试以下方法:
create or replace function funct(a int)
returns void as
$$
declare
wrclause varchar := '';
sqlq varchar ;
t varchar;
begin
IF (a IS NOT NULL ) THEN
wrclause := 'where C = '|| a ||' AND C IN ('|| a || ')';
END IF;
sqlq := ' t :=select string_agg(''select *, abcd as "D" from '' || table_namess ||, '' Union all '') as namess
from tablescollection2 ud
inner join INFORMATION_SCHEMA.Tables so on ud.table_namess = so.Table_name ' || wrclause;
raise info '%',sqlq;
perform sqlq;
raise info '%',t;
end;
$$
language plpgsql;
select funct(1);
输出:
INFO: t :=select string_agg('select *, abcd as "D" from ' || table_namess ||, ' Union all ') as namess
from tablescollection2 ud
inner join INFORMATION_SCHEMA.Tables so on ud.table_namess = so.Table_name where C = 1 AND C IN (1)
INFO: <NULL>
select funct(null)
INFO: t :=select string_agg('select *, abcd as "D" from ' || table_namess ||, ' Union all ') as namess
from tablescollection2 ud
inner join INFORMATION_SCHEMA.Tables so on ud.table_namess = so.Table_name
INFO: <NULL>
INFO:t:=select string_agg('select*,abcd作为'D'从'| | | | |,'Union all')作为名称
来自表集合2 ud
内部联接信息\u SCHEMA.Tables so on ud.table\u names=so.table\u name,其中C=1和C在(1)中
信息:
选择函数(空)
信息:t:=选择字符串_agg('选择*,从'| | | | | |,'Union all'中选择“D”作为名称
来自表集合2 ud
内部联接信息\u SCHEMA.Tables so on ud.table\u names=so.table\u name
信息:
任何与NULL
串联的字符串都将导致NULL
,正如添加到NULL
的任何数字都将导致NULL
,任何布尔表达式,如和NULL
或或NULL
将计算为NULL
@IMSoP,如果我要传递null
值,那么解决方案是什么?Thanks@IMSoP,在SQL Server中,我们可以通过使用SET CONCAT\u NULL\u products\u NULL OFF
来实现这一点。PostgreSQL呢?如果a=NULL,查询应该是什么?@Meem与其寻找一种禁用标准行为的方法,不如正确处理NULL;如果希望null为空字符串,COALESCE(var,”)
是最简单的;但在这种情况下,无论如何都会导致无效的SQL(和C in()
)。非常感谢。这里还有一个困惑:变量t
呢?它需要显示select
语句结果。变量的值在哪里:table_names?这是我将从table
中获取的列
名称“tableCollection2”。
INFO: t :=select string_agg('select *, abcd as "D" from ' || table_namess ||, ' Union all ') as namess
from tablescollection2 ud
inner join INFORMATION_SCHEMA.Tables so on ud.table_namess = so.Table_name where C = 1 AND C IN (1)
INFO: <NULL>
select funct(null)
INFO: t :=select string_agg('select *, abcd as "D" from ' || table_namess ||, ' Union all ') as namess
from tablescollection2 ud
inner join INFORMATION_SCHEMA.Tables so on ud.table_namess = so.Table_name
INFO: <NULL>