首页 > 解决方案 > PL/PostgreSQL 如何将变量转换为表名

问题描述

所以我在 PostgreSQL 中有一个函数可以从动态表中动态选择列。我从这篇文章中得到了这个解决方案,它除了一件事之外效果很好。

这是连接到节点服务器的文件内部,因此第二个 SELECT * FROM 中的 $1 和 $2 表示从那里传递的值。现在的问题是我收到了一个我不理解的语法错误(我对 SQL 比较陌生,所以这可能就是原因)。

$2 表示要从中选择的表的名称作为字符串,例如它可以是“目标”。该错误是“'goals'”处或附近的语法错误。我意识到它不能是带单引号的字符串(我相信),所以我想知道如何将该变量转换为表名?在那里使用“目标”以及目标,例如按预期工作,但我不确定如何在函数之外执行此操作。

CREATE OR REPLACE FUNCTION get_data(user_id INT, table_name anyelement)
RETURNS SETOF ANYELEMENT AS $$
    BEGIN
        RETURN QUERY EXECUTE 
            format('SELECT * FROM %s WHERE user_id = $1', pg_typeof(table_name)) USING user_id;
    END;
$$ LANGUAGE plpgsql;

SELECT * FROM get_data($1, NULL::$2);

例如,$1 是 5,$2 是“目标”

标签: postgresqlplpgsql

解决方案


经过几个小时的尝试,感谢 Adrian 的评论,我发现 MassiveJS(我如何连接到我的 PostgreSQL 服务器)具有内联函数来执行查询。在我服务器的控制器文件中,我能够创建一个这样的单行函数:

const data = await db[tableName].where("user_id=$1", [userId])

不知道 MassiveJS 中存在内联 SQL,所以很高兴发现!


推荐阅读