使用动态列名

时间:2016-10-28 10:15:38

标签: postgresql select plpgsql dynamic-sql

我试图查询包含很多列的表,如debMonth1,debMonth2等,以获得满足需要处理数据的应用程序需求的结果。

从语法上讲,查询现在似乎没问题了,但我没有从中得到结果。它只是没有错误。

我认为我对列名有疑问?有人可以帮帮我吗?

DO $do$
DECLARE cmonth TEXT;
DECLARE dmonth TEXT;

BEGIN
FOR i IN 1..15 LOOP

cmonth = CONCAT('"credMonth' , i::text, '"');   
dmonth = CONCAT('"debMonth' , i::text, '"');

EXECUTE
format('SELECT 
    "account", "FY", "setOfBooks", $1, $2, $3 AS "fiscalMonth"
FROM 
    "transaction_figures" 
WHERE 
    "dataType" = ''(80)'' AND 
    ($1 != ''0.00'' OR $2 != ''0.00'')')
USING cmonth, dmonth, i;

END LOOP;
END
$do$ LANGUAGE plpgsql;

1 个答案:

答案 0 :(得分:0)

在plpgsql中执行的查询不会导致打印输出也不会发送到客户端。您必须迭代结果并对其执行某些操作,例如:

DO $do$
DECLARE cmonth TEXT;
DECLARE dmonth TEXT;
DECLARE r RECORD;

BEGIN
FOR i IN 1..15 LOOP

cmonth = CONCAT('"credMonth' , i::text, '"');   
dmonth = CONCAT('"debMonth' , i::text, '"');

FOR r in
    EXECUTE
    format('SELECT 
        "account", "FY", "setOfBooks", $1, $2, $3 AS "fiscalMonth"
    FROM 
        "transaction_figures" 
    WHERE 
        "dataType" = ''(80)'' AND 
        ($1 != ''0.00'' OR $2 != ''0.00'')')
    USING cmonth, dmonth, i
LOOP
    RAISE NOTICE '%', r;
END LOOP;

END LOOP;
END
$do$ LANGUAGE plpgsql;

这将在psql中打印结果。如果您希望数据的行为类似于表(即发送到客户端),则必须将代码包装在plpgsql函数中并返回查询结果。