Postgres动态转换特定列

时间:2018-01-22 19:58:48

标签: sql postgresql stored-functions

我们有一个SQL服务器,但由于几个原因决定将所有内容移植到postgres服务器上。我无法重新创建其中一个SQL Server存储过程。数据每天上传到服务器。原始数据中的所有十进制数都没有小数点。该过程通过从列中找到精度来动态地计算出小数位的放置位置。定义

ALTER procedure [dbo].[adddecimal] @tableName varchar(30)
AS

DECLARE @sql VARCHAR(MAX)
SET @sql = ''

SELECT @sql = @sql + 'UPDATE ' + @tableName + ' SET ' + c.name + ' = ' + c.name + '/ power(10,'+CONVERT(varchar(10), c.scale) + ');'

FROM sys.columns c
INNER JOIN sys.tables t ON c.object_id = t.object_id
INNER JOIN sys.types y ON c.system_type_id = y.system_type_id
WHERE t.name = @tableName AND y.name ='decimal';

exec(@sql);

此输出遵循此结构

  UPDATE table1 SET col1 = col1/power(10,3); UPDATE table1 SET col2 = col2/power(10,5)'.....

我怎样才能在postgres中做相同的事情? Postgres并不想将所有命令连接成一个可执行文件。我收到此错误

ERROR:  more than one row returned by a subquery used as an expression

这是我到目前为止所拥有的

CREATE FUNCTION clean_emp2() RETURNS void AS 
  $body$
DECLARE
   prec integer := (select numeric_scale from information_schema.columns) ;
   column_nm varchar(50) := (select column_name from information_schema.columns where data_type like 'numeric');
   table_nm varchar(50) := 'test_table'; // will eventually be pulled from function call

BEGIN 
    UPDATE table_nm set column_nm = column_nm / power(10,prec)
END $body$ LANGUAGE plpgsql;

我知道我非常接近解决方案,但我不知道如何让程序返回多个UPDATE语句的字符串。

1 个答案:

答案 0 :(得分:1)

使用聚合函数string_agg将多个结果行连接成一个字符串。

然后查询将只返回一行,可以存储在变量中。