在选择查询中的所有列上执行函数

时间:2017-04-18 19:20:58

标签: sql postgresql psycopg2

我已定义此函数,以修剪尾随空格:

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(SomeColumn), count(*) from MyTable group by SomeColumn;

然而,当我尝试使用通配符时,它失败了,如下所示:

select trim_trailing_whitespace(*) from MyTable;
  

第1行:从MyTable中选择trim_trailing_whitespace(*);

     

提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。

如何在select查询中的所有列上执行函数?在我的情况下,我想在执行选择时修剪每列的尾随空格。

2 个答案:

答案 0 :(得分:0)

如果可能,请定义函数的第二个VARIADIC版本。使用FOREACH迭代args并在每个参数上执行当前函数。

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

答案 1 :(得分: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;