我在DB2(版本:9.5.8)的标签表中有以下值
select field4 from label with ur
1.5000
0.006
9.0001
104.2500
17.0000
3.5000
是否可以使用DB2中的更新查询消除小数点后的尾随零?
如果小数点后面的所有数字都是零,我需要将其保留为.0
。
预期产出:
1.5
0.006
9.0001
104.25
17.0
3.5
答案 0 :(得分:0)
您应该考虑将列更改为某种数字。无论如何,这是一个想法:
with t(s) as (
values '1.5000', '0.006', '9.0001','104.2500','17.0000','3.5'
)
select translate(rtrim(translate(s,' ','0')),'0',' ')
|| case when translate(rtrim(translate(s,' ','0')),'0',' ') like '%.'
then '0'
else ''
end
from t
1.5
0.006
9.0001
104.25
17.0
3.5
使用CTE进行翻译(rtrim(翻译('',' 0')),' 0','&# 39;)将最小化函数调用次数。
with t(s) as (values '1.5000', '0.006', '9.0001','104.2500','17.0000','3.5')
, u(s) as (
select translate(rtrim(translate(s,' ','0')),'0',' ')
from t
)
select s || case when s like '%.' then '0' else '' end
from u
1.5
0.006
9.0001
104.25
17.0
3.5
答案 1 :(得分:0)
这真是太烂了,但它应该适合你。
SELECT
trimmed || CASE WHEN LOCATE('.',trimmed) = LENGTH(trimmed) THEN '0' ELSE '' END
FROM (
SELECT TRIM(TRAILING '0' FROM field4) AS trimmed
FROM lablel
) A
如果小数是最后一个字符,CASE
语句会重新添加一个尾随零。如果您的字符串出于任何原因包含其他小数,则会中断。如果您使用的是DB2 9.7(我在这里假设LUW),那么更好的选择是使用LOCATE_IN_STRING
,当您提供负启动时,它可以从字符串的末尾开始向后工作:
SELECT
trimmed || CASE WHEN LOCATE_IN_STRING(trimmed,'.',-1) = LENGTH(trimmed) THEN '0' ELSE '' END
FROM (
SELECT TRIM(TRAILING '0' FROM field4) AS trimmed
FROM lablel
) A