【问题标题】:Postgres selection with dynamic column name具有动态列名的 Postgres 选择
【发布时间】:2023-03-08 14:30:01
【问题描述】:

我正在尝试查询一个包含很多列(如 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;

【问题讨论】:

    标签: postgresql select plpgsql dynamic-sql


    【解决方案1】:

    在 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 函数中并返回查询结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-22
      • 1970-01-01
      • 1970-01-01
      • 2017-07-07
      • 1970-01-01
      • 1970-01-01
      • 2012-07-26
      • 2017-09-21
      相关资源
      最近更新 更多