具有多个案例的Postgresql条件order by

具有多个案例的Postgresql条件order by,postgresql,plpgsql,Postgresql,Plpgsql,因此,我有一个Postgresql plpgsql语言的工作订单,看起来有点像这样: .... order by (CASE WHEN _sortcol='col_1' and _sortdir='desc' THEN col_1 end) desc NULLS LAST, (CASE WHEN _sortcol='col_2' and _sortdir='desc' THEN col_2 end) desc NULLS LAST, (CASE WHEN _s

因此,我有一个Postgresql plpgsql语言的工作订单,看起来有点像这样:

....
order by (CASE WHEN _sortcol='col_1' and _sortdir='desc' THEN col_1 end) desc NULLS LAST,
         (CASE WHEN _sortcol='col_2' and _sortdir='desc' THEN col_2 end) desc NULLS LAST,
         (CASE WHEN _sortcol='col_3' and _sortdir='desc' THEN col_3 end) desc NULLS LAST,
         ......
         (CASE WHEN _sortcol='col_N' and _sortdir='asc' THEN col_N end) NULLS LAST,
         (CASE WHEN _sortcol='col_N1' and _sortdir='asc' THEN col_N1 end) NULLS LAST,

一切正常,但这个ORDERBY子句非常混乱,而我有一个包含很多列的大表。是否存在代码改进和优化的空间,因此此代码占用的可视空间要小得多?

尽管动态SQL应该很少使用,但在这种情况下,性能可能会更好:

BEGIN
  ..
  EXECUTE format('SELECT .. ORDER BY %I %s', _sortcol, 
    CASE _sortdir WHEN 'desc' THEN 'desc'
                  WHEN 'asc' THEN 'asc'
                  ELSE 'asc' END);

当您使用动态SQL时,每次都必须考虑防止SQL注入。每个字符串参数必须转义或仅限于安全值。

Hello Pavel。谢谢你的回复。你是对的,这不是最好的选择,因为它有sql注入风险,而且我的查询有用户输入。如何坚持参数化查询并改进我的代码?如果您清理用户输入,那么动态SQL是安全的-查看文档中的
格式
函数。除了动态SQL之外,没有其他方法。在你的例子中,CASE-ORDER-BY对于更多的列和行来说是非常慢的。你能给我一个关于清理用户输入的线索吗?我一直依赖于参数化查询。@IvanKolyhalov-每次使用类似字符串的查询标识符时,都应该使用函数
quote_ident
,或者可以使用
format
函数,也可以使用
%I
占位符。对于其他字符串,您可以检查内容是否正确-就像我为
\u sortdir
所做的那样。