通常,我在如下所示的postgres中编写函数
with detail_data as(
select
id
from
product p
where
category = PARAM1_HERE
order by update_time)
现在,我想将查询更改为动态顺序。我尝试如下
with detail_data as(
execute 'select id from product p where category = $1 order by $2'
using PARAM1_HERE,PARAM2_HERE)
编译时出现错误:
错误:“执行”或附近的语法错误
我该如何解决?
答案 0 :(得分:0)
该命令不起作用,因为EXECUTE
是PL / pgSQL命令,而不是SQL
命令-如果您不使用准备好的语句。话虽如此,您可能想尝试使用实函数。
测试数据
CREATE TABLE product (id INT, category INT, txt TEXT);
INSERT INTO product VALUES (1,1,'x'),(42,1,'f'),(8,1,'a'),(2,1,'j');
功能
CREATE OR REPLACE FUNCTION cte_function(INT,TEXT)
RETURNS TABLE(res INT) AS $$
BEGIN
RETURN QUERY
EXECUTE FORMAT('SELECT id FROM product WHERE category=%L ORDER BY %I',$1,$2);
END; $$ LANGUAGE plpgsql;
测试(按ID排序)
SELECT * FROM cte_function(1,'id') ;
res
-----
1
2
8
42
(4 rows)
测试(按txt排序)
SELECT * FROM cte_function(1,'txt') ;
res
-----
8
42
2
1
(4 rows)