【问题标题】:Remove trailing zeros after decimal point in DB2删除 DB2 中小数点后的尾随零
【发布时间】:2014-06-03 16:43:50
【问题描述】:

我在 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

【问题讨论】:

  • field4的数据类型是什么?如果它是数字,您需要在查询中根据自己的喜好修改格式,而不是尝试在数据库中更改它。
  • 它的 varchar2。但我不想更改列格式
  • VARCHAR2 是 Oracle 专有数据类型,您说您使用的是 DB2。为什么要将数字存储在字符列中?
  • 对不起,是人品

标签: db2 text-parsing


【解决方案1】:

您可能应该考虑将列更改为某种数字。无论如何,这是一个想法:

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

对 translate(rtrim(translate(s,' ','0')),'0',' ') 使用 CTE 将最大限度地减少函数调用的次数。

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

【讨论】:

    【解决方案2】:

    这真的很hacky,但它应该适合你。

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-02
      • 1970-01-01
      • 2017-03-01
      相关资源
      最近更新 更多