【问题标题】:SQL server removing traling zero after decimal points in a stringSQL Server 删除字符串中小数点后的尾随零
【发布时间】:2013-09-20 19:37:44
【问题描述】:

我有以下变量:

DECLARE @test nvarchar(100)
SET @test =  'Prodcut A (Average: 1.000)'
SET @test =  'Prodcut B (Average: 2.3500)'

我的输出应该是:产品 A(平均:1.0),产品 B(平均:2.35)

如何从 SQL Server 的 nvarchar 数据类型列中删除所有尾随零? 我确信我必须使用 SUBSTRING 和 CHARINDEX 但不确定如何使用。有人可以帮帮我吗?

我尝试了以下方法:

IF charindex('.', @test ) > 0 
   select  SUBSTRING(@test, PATINDEX('%[^0 ]%', @test+ ' '), LEN(@test))                    
End

【问题讨论】:

  • 你的意思是trailing zeroes?
  • @Quassnoi 操作更新标签和标题,之前没有提到引擎
  • 是否将始终使用“平均值:”+数字+“)”构造列?
  • 是的。该列被定义为 NVARCHAR 值有时类似于“平均:”+数字+“)”

标签: sql sql-server


【解决方案1】:

您可以遍历字符串以查找最后一个非“0”字符的位置,但这很麻烦。

请注意,您可能会偶尔遇到浮点错误,这将满足您的需求:

convert(varchar, convert(float, '123.40')) -- yields '123.4'
convert(varchar, convert(float, @test))

【讨论】:

  • 由于描述的要求是 OT,偶尔宁愿定期 ;-)
  • 布莱赫。没错,我优化了字符串已经完全组成的事实。
【解决方案2】:

如果结构始终相同,您可以使用以下内容:

Declare @a Table (test varchar(100))
Insert into @a Values ('Prodcut X ')
Insert into @a Values ('Prodcut A (Average: 1.000)')
Insert into @a Values ('Prodcut B (Average: 2.3500)')
Insert into @a Values ('Prodcut C (Average: 2.0510)')


Select  
Case When charindex('.', test ) > 0 then
   LEFT(test, LEN(test) + 1  - 
   Case When 
      PATINDEX('%[1-9]%', Reverse(test) + ' ')
    > PATINDEX('%[.]%', Reverse(test) + ' ')
    then PATINDEX('%[.]%', Reverse(test) + ' ') - 1
    else PATINDEX('%[1-9]%', Reverse(test) + ' ') 
    end 
    ) +')'
else test end
from @a

【讨论】:

    【解决方案3】:

    假设

    是的。该列被定义为 NVARCHAR 值有时就像 "平均:" + 数字 + ")"

    您可以将numberdecimal 类型转换为float,因为float 打印时没有尾随零:

    'Average:' + cast(number as float) + ')'
    

    但是当decimal. 作为分隔符并且float 类型有, 时,存在一个已知的本地化问题(即,它出现在某些非英语版本中,例如俄语版本)。在这种情况下,您需要:

    'Average:' + replace(cast(cast(number as float) as nvarchar), ',', '.') + ')'
    

    ,即将逗号替换为点。

    【讨论】:

      【解决方案4】:

      试试这个

       DECLARE @test nvarchar(100)
      SET @test =  'Prodcut A (Average: ' + CONVERT(VARCHAR,CAST(1.000 as float))+')'
      SET @test =  'Prodcut B (Average: ' + CONVERT(VARCHAR,CAST(2.3500 as float))+')'
      SELECT @test
      

      【讨论】:

        【解决方案5】:

        请尝试以下代码。

        DECLARE @test nvarchar(100)
        SET @test =  'Prodcut A (Average: ' + CONVERT(VARCHAR,CAST(1.000 as float))+')'
        
        SELECT @test
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-10-21
          • 1970-01-01
          • 1970-01-01
          • 2011-04-28
          • 1970-01-01
          • 2014-08-09
          相关资源
          最近更新 更多