2017-01-14 71 views
1

我有需要输入一个表的名称的后缀的过程。然后,使用执行格式(),我传递此参数来执行动态查询。问题是,这个参数是一样的贯穿 - 我不想把它传递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); 
+0

此外,也没有必要使用表名对每列,如果没有一个加入,但即使有一个连接,您可以使用别名表,所以不需要Concat的多次完整的表名。 – llouk

+1

这就是我刚刚加入的答案... – wildplasser

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

详情:

+0

@wildplasser:你似乎缺少我这样做了。不需要(更昂贵的)变量,你可以传递连接的表达式作为参数。另外:它是'quote_ident()',而不是'quote_identifier()'。 –

+0

糟糕,我没有看到。 – wildplasser

相关问题