PL/PostgreSQL 如何将变量转换为 table 名称
PL/PostgreSQL how to convert a variable into a table name
所以我在 PostgreSQL 中有一个函数可以动态地从动态 table 中选择列。我从 this post 那里得到了这个解决方案,它除了一件事之外效果很好。
这是一个连接到节点服务器的文件内部,因此第二个 SELECT * FROM 中的 $1 和 $2 表示从那里传递的值。现在的问题是我遇到了一个我不明白的语法错误(我是 SQL 的新手,所以这可能就是原因)。
$2 表示要作为字符串从中选择的 table 的名称,例如它可以是 'goals'。该错误是“'goals'”处或附近的语法错误。我意识到它不能是带单引号的字符串(我相信),所以我想知道如何将该变量转换为 table 名称?在那里使用“目标”以及目标,例如按预期工作,但我不确定如何在函数之外执行此操作。
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 = ', pg_typeof(table_name)) USING user_id;
END;
$$ LANGUAGE plpgsql;
SELECT * FROM get_data(, NULL::);
例如,$1 是 5,$2 是 'goals'
经过几个小时的尝试,感谢 Adrian 的评论,我发现 MassiveJS(我连接到我的 PostgreSQL 服务器的方式)有 inline functions to do queries。在我服务器的控制器文件中,我能够这样创建一个单行函数:
const data = await db[tableName].where("user_id=", [userId])
不知道内联 SQL 存在于 MassiveJS 中,所以很高兴发现!
所以我在 PostgreSQL 中有一个函数可以动态地从动态 table 中选择列。我从 this post 那里得到了这个解决方案,它除了一件事之外效果很好。
这是一个连接到节点服务器的文件内部,因此第二个 SELECT * FROM 中的 $1 和 $2 表示从那里传递的值。现在的问题是我遇到了一个我不明白的语法错误(我是 SQL 的新手,所以这可能就是原因)。
$2 表示要作为字符串从中选择的 table 的名称,例如它可以是 'goals'。该错误是“'goals'”处或附近的语法错误。我意识到它不能是带单引号的字符串(我相信),所以我想知道如何将该变量转换为 table 名称?在那里使用“目标”以及目标,例如按预期工作,但我不确定如何在函数之外执行此操作。
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 = ', pg_typeof(table_name)) USING user_id;
END;
$$ LANGUAGE plpgsql;
SELECT * FROM get_data(, NULL::);
例如,$1 是 5,$2 是 'goals'
经过几个小时的尝试,感谢 Adrian 的评论,我发现 MassiveJS(我连接到我的 PostgreSQL 服务器的方式)有 inline functions to do queries。在我服务器的控制器文件中,我能够这样创建一个单行函数:
const data = await db[tableName].where("user_id=", [userId])
不知道内联 SQL 存在于 MassiveJS 中,所以很高兴发现!