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>