我有一个sql函数,它执行一个简单的sql select语句:
CREATE OR REPLACE FUNCTION getStuff(param character varying)
RETURNS SETOF stuff AS
$BODY$
select *
from stuff
where col = $1
$BODY$
LANGUAGE sql;
现在,我像这样调用此函数:
select * from getStuff('hello');
如果我需要订购和限制order by
和limit
个子句的结果,我有什么 Select ?
我猜这样的问题:
select * from getStuff('hello') order by col2 limit 100;
效率不是很高,因为表stuff
中的所有行都将由函数getStuff
返回,然后才按限制排序和切片.
但是,即使我是对的,也没有简单的方法来传递SQL语言函数的order by参数.只能传递值,不能传递SQL语句的一部分.
另一种 Select 是用plpgsql
语言创建函数,其中可以构造查询并通过EXECUTE
执行它.但这也不是一个很好的方法.
那么,有没有其他方法可以做到这一点呢? 或者你会 Select 什么选项?在函数之外排序/限制,还是plpgsql?
我正在使用PostgreSQL9.1.
编辑
我修改了CREATE Function语句,如下所示:
CREATE OR REPLACE FUNCTION getStuff(param character varying, orderby character varying)
RETURNS SETOF stuff AS
$BODY$
select t.*
from stuff t
where col = $1
ORDER BY
CASE WHEN $2 = 'parent' THEN t.parent END,
CASE WHEN $2 = 'type' THEN t."type" END,
CASE WHEN $2 = 'title' THEN t.title END
$BODY$
LANGUAGE sql;
This throws:
错误:大小写类型字符变化和整数不匹配 ŘáDKA 13:当$1=‘Parent’时,则t.Parent
stuff
表格如下所示:
CREATE TABLE stuff
(
id integer serial,
"type" integer NOT NULL,
parent integer,
title character varying(100) NOT NULL,
description text,
CONSTRAINT "pkId" PRIMARY KEY (id),
)
编辑2
我读DEM代码读得很差.我已将其更正为有疑问的.这个代码对我很有效.