PostgreSQL - 使用函数在选择查询中命名列

Posted

技术标签:

【中文标题】PostgreSQL - 使用函数在选择查询中命名列【英文标题】:PostgreSQL - Use a function to name a column in a select query 【发布时间】:2019-01-29 22:41:19 【问题描述】:

我正在尝试动态设置“select .. from”查询中的列名。所以我创建了一个函数来返回列的名称并尝试在选择查询中使用它。

功能就是这个:

CREATE OR REPLACE FUNCTION get_column_name(iddoc int, campo text) RETURNS text
AS $$
#print_strict_params on
DECLARE
campoid text;
BEGIN

    SELECT campo_id INTO STRICT campoid
    FROM campos_td c
    JOIN (SELECT field4, field3 
        FROM frm7 
        WHERE iddocumento = iddoc) f ON c.tema_id = f.field3

    RETURN 'field10' || campoid;
END
$$ LANGUAGE plpgsql;

我已经尝试过这样的事情:

SELECT get_column_name(2, 'Size') FROM frm7
SELECT f.get_column_name(2, 'Size') FROM frm7 as f

但它们都不起作用。

【问题讨论】:

聪明,但 SQL 不能那样工作。函数不能返回标识符。列需要硬编码。 【参考方案1】:

pgsql EXECUTE command 允许您运行任意 SQL 字符串,尤其是您使用在运行时传入的列名构建的 SQL 字符串。

【讨论】:

我尝试了以下方法:准备查询(文本)AS SELECT $1 FROM frm7 f EXECUTE query1 (get_column(2, 'Asunto'))。但结果是选择某些文本而不是选择列,因此结果不是预期的。 这是EXECUTE 的不同用法。你想要EXECUTE inside 一个 PGSQL 存储过程。 (请参阅答案中的链接。)您的最终结果将类似于SELECT * FROM my_stored_procedure('column_foo');。是否将其作为准备好的语句或仅作为原始 SQL 查询执行取决于您,并且可能并不重要。【参考方案2】:

我对sql不太熟悉,但你可以试试这个:

DECLARE @query NVARCHAR(MAX);

set @query = 'SELECT ' + get_column_name(2, 'Size') + ' FROM frm7';

execute @query;

示例:

DECLARE @query NVARCHAR(MAX);
DECLARE @colName NVARCHAR(MAX) = 'col1'; 
set @query = 'SELECT ' + @colName + ' FROM frm7';

execute @query;

【讨论】:

以上是关于PostgreSQL - 使用函数在选择查询中命名列的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在 PostgreSQL 查询中定义一个命名常量?

postgreSQL 选择聚合函数中未使用的附加列

PostgreSQL中的函数中是不是有命名参数的约定

PostgreSQL中的选择或布尔聚合函数

在 postgresql 中优化潜在客户查询

如何在 postgresql 中使用不同的返回数据执行多个选择查询?