PostgreSQL 9.3:准备动态字符串

PostgreSQL 9.3: Prepare dynamic string

我想使用函数准备一个动态字符串。

这里有两个主要问题:一个是传递给函数,另一个是 另一个存在于函数中。输出字符串将发生变化 根据传递给函数的字符串。

示例:

我有字符串 string1 将传递给函数。并且 string2 存在于函数中。

函数中存在一个 string2 的字符串:

string2 = 'A1,A2,A3,A4'

我传递给函数的字符串是 string1

string1 = 'A1'

那么预期的准备好的字符串应该是这样的:

A1 = 1 AND A2 IS NULL AND A3 IS NULL AND A4 IS NULL

为了上面的结果我写了下面的函数:

CREATE OR REPLACE FUNCTION f_test(string1 varchar)
RETURNS VOID AS
$$
DECLARE
    string2 varchar = 'A1,A2,A3,A4';
    string3 varchar;
    string4 varchar;
    string5 varchar;
    string6 varchar;
BEGIN
    string3 := REPLACE(string1,',',' = 1 AND ')||' = 1';

    RAISE INFO '%',string3;

    string4 := REPLACE(string2,string1,string3);

    RAISE INFO '%',string4; 

    string5 := REPLACE(string4,'1,',' 1 AND ');

    string6 := REPLACE(string5,',', ' IS NULL AND ')||' IS NULL ';

    RAISE INFO '%',string6; 
END;
$$
LANGUAGE PLPGSQL;

调用功能

SELECT f_test('A1');

结果:(右)

A1 =  1 AND A2 IS NULL AND A3 IS NULL AND A4 IS NULL 

但是传球的时候卡住了A4

SELECT f_test('A4');

结果:(错误)

A 1 AND A2 IS NULL AND A3 IS NULL AND A4 =  1 

当我期待时:

A1 IS NULL AND A2 IS NULL AND A3 IS NULL AND A4 =  1 

如果我打电话:

SELECT f_test('A2,A4');

那么结果应该是:

A1 IS NULL AND A2 = 1 AND A3 IS NULL AND A4 =  1 

试试这个

CREATE OR REPLACE FUNCTION f_test(string1 varchar)
RETURNS VOID AS
$$
DECLARE
    string2 varchar = 'A1,A2,A3,A4,A5,A6,A7';
    string3 varchar;
    string4 varchar;
    string5 varchar;
    string6 varchar;
    intCount int;
BEGIN
    string3 := REPLACE(string1,',',' = 1 AND ')||' = 1';

    RAISE INFO '%',string3;

    string4 := REPLACE(string2,string1,string3);

    RAISE INFO '%',string4; 
select string_agg(c,' AND ') into  string6 from (
select  * from (
select c ||'= 1' c from (
select regexp_split_to_table(string2,',') c
)t 
where c in (select regexp_split_to_table(string1,','))
union all 
select c ||' IS NULL ' c from (
select regexp_split_to_table(string2,',') c
)t 
where  c  not in (select regexp_split_to_table(string1,','))
) t group by c order by c 
)t;
    RAISE INFO '%',string6; 
END;
$$
LANGUAGE PLPGSQL;

呼叫 : - select f_test('A3,A5')select f_test('A3,A5,A2,A6')