postgresql - 具有动态列名的 Postgres 选择

标签 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;

最佳答案

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

关于postgresql - 具有动态列名的 Postgres 选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40302940/

相关文章:

sql - 将 double 转换为日期格式

sql - 使用临时表替换 WHERE IN 子句

c# - 获取过程参数的数据类型

sql - 创建触发器以将数据从一个表复制到另一个表

PostgreSQL - 尽管运行 CREATE LANGUAGE,但语言 pgplsql 不存在

Mysql 与 Postgres 读取操作

sql - Linq到SQL : Get top 10 most ordered products

php - 如何使我的 HTML 表单查询同时适用于所有表单元素?

postgresql - 有没有办法在 postgresql 中捕获延迟约束的异常?

arrays - 在 PL/pgSQL 中循环遍历给定的值列表