未标记差异。1)您需要将1替换为a。2) 这将阻止Optimizer使用索引等。它确实会产生一个用于多种目的的查询,但应该针对动态sql检查性能开销。(每个查询只能创建一个计划,但不同的order by子句可能需要不同的计划才能有效。)这是正确的,它根据a
未标记差异。1)您需要将1替换为a。2) 这将阻止Optimizer使用索引等。它确实会产生一个用于多种目的的查询,但应该针对动态sql检查性能开销。(每个查询只能创建一个计划,但不同的order by子句可能需要不同的计划才能有效。)这是正确的,它根据a,sql,database,postgresql,dynamic-sql,plpgsql,Sql,Database,Postgresql,Dynamic Sql,Plpgsql,未标记差异。1)您需要将1替换为a。2) 这将阻止Optimizer使用索引等。它确实会产生一个用于多种目的的查询,但应该针对动态sql检查性能开销。(每个查询只能创建一个计划,但不同的order by子句可能需要不同的计划才能有效。)这是正确的,它根据a是否等于“asc”按第一列降序或升序排序。但我还是会编辑,让它更清楚。这是不合法的。表达式中不能有ASC或DESC。@asnyder是的,这是一个无法工作的示例;)非常旧的答案,因此质量还有很多需要改进的地方。为了避免数据类型问题当$2='a'
未标记差异。1)您需要将
1
替换为a
。2) 这将阻止Optimizer使用索引等。它确实会产生一个用于多种目的的查询,但应该针对动态sql检查性能开销。(每个查询只能创建一个计划,但不同的order by子句可能需要不同的计划才能有效。)这是正确的,它根据a是否等于“asc”按第一列降序或升序排序。但我还是会编辑,让它更清楚。这是不合法的。表达式中不能有ASC或DESC。@asnyder是的,这是一个无法工作的示例;)非常旧的答案,因此质量还有很多需要改进的地方。为了避免数据类型问题<代码>当$2='a'然后是a结束时按案例排序,当$2='b'然后是b结束时按案例排序,等等。但请注意,这与我在soulcheck的回答中提到的优化问题相同。这不是我所指的数据类型问题。显然$2将始终是相同的数据类型。如果列a和列b是不同的数据类型,那么可能会引起一些问题。我给出的示例将每个字段作为单独的子句按顺序排列。CASE语句按null、null、x、null产生顺序(例如),因此导致数据类型独立性。感谢您的回答和评论。我正在使用Dems版本的CASE
,但是postgresql抛出:错误:当我尝试创建函数时,CASE类型字符变化和整数无法匹配(在之后的位置上,然后
-wird)。我将编辑问题并添加完整的来源…正是我所说的问题。您需要确保将所有结果转换为相同的数据类型。Brandstetter:哇,现在您已经向我学习了一些plpgsql:-)我不知道如何使用返回查询执行和。这是一个非常优雅的解决方案,我现在不担心plpgsql方法。非常感谢你!如何添加ASC或DESC?@erwin:我想动态添加,就像为orderby添加一样。我想动态地通过升序或降序。@Sachin:问一个有相关细节的新问题。评论不是地方。如果需要上下文,您可以始终链接到此链接。有简单安全的解决方案。请检查此问题。
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');
select * from getStuff('hello') order by col2 limit 100;
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;
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),
)
ORDER BY CASE condition_variable
WHEN 'asc' THEN column_name ASC
ELSE column_name DESC
END;
SELECT
<column list>
FROM
Stuff
WHERE
col1 = $1
ORDER BY
CASE $2
WHEN 'col1' THEN col1
WHEN 'col2' THEN col2
WHEN 'col3' THEN col3
ELSE col1 -- Or whatever your default should be
END
SELECT * FROM get_stuff('hello', 'col2', 100);
CREATE OR REPLACE FUNCTION getStuff(param varchar)
RETURNS setof STUFF
LANGUAGE SQL
STABLE
AS $$ ... $$;
CREATE FUNCTION sort_stuff(sort_col TEXT, sort_dir TEXT DEFAULT 'asc')
RETURNS SETOF stuff
LANGUAGE SQL
STABLE
AS $$
SELECT *
FROM stuff
ORDER BY
-- Simplified to NULL if not sorting in ascending order.
CASE WHEN sort_dir = 'asc' THEN
CASE sort_col
-- Check for each possible value of sort_col.
WHEN 'col1' THEN col1
WHEN 'col2' THEN col2
WHEN 'col3' THEN col3
--- etc.
ELSE NULL
END
ELSE
NULL
END
ASC,
-- Same as before, but for sort_dir = 'desc'
CASE WHEN sort_dir = 'desc' THEN
CASE sort_col
WHEN 'col1' THEN col1
WHEN 'col2' THEN col2
WHEN 'col3' THEN col3
ELSE NULL
END
ELSE
NULL
END
DESC
$$;
SELECT *
FROM stuff
ORDER BY <sort_col> <sort_dir>