2017-01-14 54 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

相關問題