2012-08-22 38 views
2

我在PostgreSQL函数中有一个临时表,我想插入一个新的VARCHAR列。它应该有一个值取决于表中的另一列,名为“数量”。在临时表中添加一个新列

当金额为正值时,我希望列行的值为贷方,当值为负时,该列应为借方。

我还有一个要求:我想轮2个十进制数字

回答

4

你想ALTER TABLE ... ADD COLUMN后跟UPDATE量列的值。

我最初说ALTER TABLE ... ADD COLUMN ... USING但这是错误的两个罪名。 ADD COLUMN需要DEFAULT而不是USING - 并且您无法一次完成此操作,因为DEFAULT表达式和USING表达式都不会引用其他列。

所以你必须做到:

ALTER TABLE tablename ADD COLUMN colname varchar; 
UPDATE tablename SET colname = (CASE WHEN othercol < 0 THEN 'Credit' ELSE 'Debit' END); 

仔细思考是否为零应该是“借”或“信用”,并相应调整CASE思考。

四舍五入,请使用round(amount,2)。你的问题没有足够的细节让我确定如何;可能通过UPDATE临时表与UPDATE thetable SET amount = round(amount,2)但没有上下文很难知道如果这是正确的。 该声明不可逆地丢弃信息因此它应该只用于数据的副本。

+0

我试过'ALTER TABLE tmp_table ADD col1 varchar USING(CASE when SU​​M <0 THEN'Credit'ELSE'Debit'END);'但是在“USING”处或附近有语法错误。 四舍五入说:'函数圆(双精度,整数)不存在' – user1392203

+0

@ user1392203你说得很对。我的错误完全。实际上有两个错误:第一,'ADD COLUMN'采用'DEFAULT'而不是'USING'; 'USING'用于'ALTER COLUMN ... SET DATA TYPE'。其次,'DEFAULT'和'USING'都不能指向其他列,所以这是错误的。更新。 –

+0

@ user1392203至于'round()',你没有指定你的表结构或类型,所以它不可能是精确的。在'psql'中运行'\ df round'会显示不同的'round()'函数。在那里你会看到采用精确参数的'round'形式是'round(numeric,integer)'。所以如果你有一个'double precision'参数,你可能必须将它转换为数字''round(amount :: numeric,2)' –