格式()的动态查询多次使用相同的参数

时间:2017-01-14 15:03:02

标签: sql database postgresql plpgsql dynamic-sql

我有一个过程,它将表名的后缀作为输入。然后,使用execute format(),我传递此参数来执行动态查询。问题是这个参数在整个过程中是相同的 - 我不想这样传递x次:

execute format('SELECT table_%s.field1, table_%s.field2,table_%s.field3
FROM table_%s', inTableSuffix, inTableSuffix, inTableSuffix, inTableSuffix, ...) 

我想要一种类似于以下内容的格式:

execute format('SELECT table_%s.field1, table_%s.field2,table_%s.field3
FROM table_%s', inTableSuffix) 

我知道我可以使用表名的别名来解决这个问题,但还有另一种选择吗?

2 个答案:

答案 0 :(得分:3)

您可以重复解决位置参数,如下所示:

execute format('SELECT table_%1$s.field1
   , table_%1$s.field2,table_%1$s.field3
FROM table_%1$s;', inTableSuffix); 

注意:在这种特殊情况下,您可以避免使用别名重复自己:

execute format('SELECT tx.field1
   , tx.field2, tx.field3
FROM table_%s tx;', inTableSuffix); 

答案 1 :(得分:1)

@wildplasser already provided the syntax如何在format()中重复引用相同的参数。但是代码仍然很危险。您 需要 来转义根据用户输入构建的标识符:

EXECUTE format('SELECT field1, field2, field3 FROM %I', 'table_' || inTableSuffix);

对于给定的示例,您只需要参数一次。在plpgsql中使用EXECUTE执行的动态查询的范围仅限于查询本身。函数的其他变量或参数在EXECUTE可见。因此,不需要使用FROM子句中的单个表对动态查询中的列进行表限定。

但更重要的是,%I is used in format()用于标识符以避免语法错误,误导低层,或者更糟糕的是SQL注入!它会双引号(仅限!)非法标识符just like quote_ident() would

详细说明: