我有一个执行简单的sql select语句的sql函数:
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 byandlimit子句对结果进行排序和限制,我有哪些选择?
我猜这样的查询:
select * from getStuff('hello') order by col2 limit 100;
效率不是很高,因为表中的所有行都stuff将由函数返回,getStuff然后才按限制排序和切片。
但是,即使我是对的,也没有简单的方法来通过sql语言函数的参数传递命令。只能传递值,不能传递sql语句的一部分。
另一个选择是用plpgsql语言创建函数,可以在其中构造查询并通过执行它EXECUTE。但这也不是一个很好的方法。
那么,还有其他方法可以实现这一目标吗?还是您会选择什么选项?在函数之外还是plpgsql进行排序/限制?
我正在使用PostgreSQL 9.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;
该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
我已经严重阅读了Dems代码。我已将其更正为问题。这段代码对我有用。
plpgsql函数对于更复杂的东西没有任何问题。可能会影响性能的唯一情况是嵌套plpgsql函数时,因为查询计划程序无法在外部查询的上下文中进一步优化所包含的代码,这可能会使速度变慢,也可能不会使其变慢。
在此稍后的答案中有更多详细信息:
PostgreSQL函数中的语言sql和语言plpgsql之间的区别
在这种情况下,它比CASE查询中的许多子句简单得多:
CREATE OR REPLACE FUNCTION get_stuff(_param text, _orderby text, _limit int)
RETURNS SETOF stuff AS
$func$
BEGIN
RETURN QUERY EXECUTE '
SELECT *
FROM stuff
WHERE col = $1
ORDER BY ' || quote_ident(_orderby) || ' ASC
LIMIT $2'
USING _param, _limit;
END
$func$ LANGUAGE plpgsql;
称呼:
SELECT * FROM get_stuff('hello', 'col2', 100);
笔记
用于RETURN QUERY EXECUTE
一次性返回查询结果。
使用quote_ident()
标识符反对SQLI保障。
或format()更复杂的事情。看:
表名作为PostgreSQL函数参数
将参数值与USING子句一起传递,以避免再次进行强制转换,引号和SQLi。
注意不要在参数和列名之间创建命名冲突。_在示例中,我在参数名称前添加了下划线()。只是我个人的喜好。
编辑后的第二个函数无法工作,因为您只能parent在声明返回类型时返回SETOF stuff。您可以声明自己喜欢的任何返回类型,但是实际的返回值必须与声明匹配。您可能想要使用RETURNS TABLE它。
问题内容: 我想在Postgres函数中将表名作为参数传递。我尝试了这段代码: 我得到了这个: 这是我更改为此时遇到的错误: 可能有效,因为如果没有where 得到的部分1,则表示已选定某项。为什么第一个工作和第二个工作不能同时进行?以及如何解决呢? 问题答案: 这可以进一步简化和改进: 使用架构限定名称进行调用(请参见下文): 或者: 要点 使用OUT参数简化功能。您可以直接选择动态SQL的结果
我正在尝试优化这个查询,该查询通过字段(第1个)和字段(第2个)对进行排序。没有第一个字段查询需要大约0.250秒,但有了它需要大约2.500秒(意味着慢了10倍,可怕)。有什么建议吗? 注意: -使用InnoDB(MySQL 5.7.19) -主要是表上的 -字段同时被索引和 解释结果: 更新^^ 信誉规定:一个帖子,多少(n=信誉)天可以显示在列表的顶部。 实际上,我试图给一些帖子的声誉,可以
看看下面的伪C++代码: 有两个函数带有参数。参数计数大于三,但为了简单起见,例如设为三。 -它是模板函数,具有与相同的参数计数,并且参数具有与相同的类型。但是(!)参数上的顺序可以(或不能)不同。例如: 那么如何在中重新排序参数,以便使用正确的参数序列调用呢?
主要内容:JSF数据表更新行数据实例JSF中有一个叫作的控件,可用来渲染和格式化表格。使用,我们可以迭代收集或数组数组来显示数据。下面我们来学习如何向排序数据。 要使用,我们需要添加以下HTML头。 以下JSF标签 - 被渲染成以下HTML标签。 JSF数据表更新行数据实例 打开 NetBeans IDE 创建一个Web工程:DataTableSort,其目录结构如下所示 - 创建以下文件代码,文件:index.xhtml 的代码内
当我在spring boot中使用postgresql函数时,当我使用array参数时,它返回一个数据不匹配错误。 我有一份模型文件。我正在将数据按顺序保存到这个模型文件中。当我以下面的方式将此发送到函数时,我得到一个错误。 多谢了。
问题内容: 我有2个表格-包含课程ID和课程名称的课程以及包含每个课程标签的tagCourse。 我想编写一个函数,该函数按给定的标签数组搜索课程,并按匹配标签的数量将其返回。但是我不知道如何正确,有效地编写它。请帮我。 IE。 问题答案: CREATE OR REPLACE FUNCTION search_by_tags(tags varchar[]) RETURNS TABLE (id_cou