【问题标题】:PostgreSQL - Use a function to name a column in a select queryPostgreSQL - 使用函数在选择查询中命名列
【发布时间】: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 不能那样工作。函数不能返回标识符。列需要硬编码。

标签: sql postgresql postgresql-9.2


【解决方案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;

【讨论】:

    猜你喜欢
    • 2018-01-11
    • 1970-01-01
    • 2011-08-25
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    • 2012-11-25
    相关资源
    最近更新 更多