执行选择查询到WITH变量

时间:2019-12-14 03:47:30

标签: postgresql function

通常,我在如下所示的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)

编译时出现错误:

  

错误:“执行”或附近的语法错误

我该如何解决?

1 个答案:

答案 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)