2017-04-18 234 views
0

我已經定義了這個功能對所有列執行一個函數,修剪尾隨空白:在選擇查詢

select trim_trailing_whitespace(SomeColumn), count(*) from MyTable group by SomeColumn; 

但是:

create or replace function trim_trailing_whitespace(value text) returns text as $$ begin return regexp_replace(value, '\s+$', ''); end; $$ language plpgsql immutable; 

它在查詢中使用像這樣的時候正常工作

select trim_trailing_whitespace(*) from MyTable; 
:,當我嘗試用通配符來利用它,像這樣失敗

第1行:從MyTable中選擇trim_trailing_whitespace(*);

提示:沒有函數匹配給定的名稱和參數類型。您可能需要添加顯式類型轉換。

如何在選擇查詢中的所有列上執行函數?在我的情況下,我想在執行選擇時從每列中刪除尾隨的空白。

回答

0

如果可能,請定義第二個VARIADIC版本的函數。用FOREACH迭代參數並在每個參數上執行當前函數。

很好的例子:https://www.depesz.com/2008/07/31/waiting-for-84-variadic-functions/

+0

或使用row_to_json傳遞數據作爲JSON ...記住,除非你的函數返回一個特定類型的行,JSON很可能是最好的選擇之一,考慮到它如何被使用。 –

+0

這看起來很有希望,但我無法讓它在具有多列的行上工作。 –

0

您可以使用動態SQL或手動展開*自己。

SELECT FORMAT(
    'SELECT %s FROM %I.%I.%I;', 
    string_agg(
    FORMAT(
     'trim_trailing_whitespace(%I)', 
     column_name 
    ), 
    ', ' 
) 
    , table_catalog, table_schema, table_name 
) 
FROM information_schema.columns 
WHERE table_catalog = current_catalog 
    AND table_schema = current_schema 
    AND table_name = 'MyTable' 
GROUP BY table_catalog, table_schema, table_name; 
+0

當我運行它時,這不會返回任何內容。 –

+0

你用你的表名替換了MyTable嗎? –

+0

我做到了。仍然沒有結果。爲了清楚起見,我想在返回它們之前將這個函數應用於每行的每一列。 –