2017-04-18 98 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

我做到了。仍然没有结果。为了清楚起见,我想在返回它们之前将这个函数应用于每行的每一列。 –