我有一个过程,它将表名的后缀作为输入。然后,使用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)
我知道我可以使用表名的别名来解决这个问题,但还有另一种选择吗?
答案 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。
详细说明: