SQL Server:从nvarchar

时间:2017-10-25 16:16:14

标签: sql sql-server

我有一些数据以nvarchar的形式出现。显然,数据最初是从基于数字的数据类型转换而来的。例如,我的值为17.0000000。我想删除这些尾随的零,以便它只是“17”。我确实需要varcharnvarchar中的输出。

5 个答案:

答案 0 :(得分:3)

您可以使用以下方法删除小数和零:

select (case when col like '%.0%' and col not like '%.%[^0]%'
             then left(col, charindex('.', col) - 1)
             when col like '%.%0'
             then replace(rtrim(replace(col, '0', ' ')), ' ', '0')
             else col
        end)

注意:这假设该值是严格数字的(因此没有自己的空格)。

但是,我建议您将该值转换为适当的numeric / decimal类型。

答案 1 :(得分:1)

如果2012 +

,还有另一种选择

示例

Declare @YourTable Table ([StrValue] varchar(50))
Insert Into @YourTable Values 
 ('17.00000')
,('17.10000')
,('.1')
,('.0')
,('Cat')
,('07/29/2017')

Select * 
      ,NewVal = coalesce(convert(varchar(50),try_convert(float,StrValue)),StrValue)
 From @YourTable

<强>返回

StrValue    NewVal
17.00000    17
17.10000    17.1
.1          0.1
.0          0
Cat         Cat
07/29/2017  07/29/2017

答案 2 :(得分:0)

SELECT LEFT('17.0000000',CHARINDEX('17.0000000','.')-1)

我在这里硬编码了这个值,但你要用你的列名

替换它

答案 3 :(得分:0)

双重演员也将摆脱尾随零

select cast(cast('17.0000000' as float) as varchar)
union
select cast(cast('17.1000000' as float) as varchar)

结果

17
17.1    

答案 4 :(得分:0)

使用case的另一种方法可以是:

select col
    , reverse(                      -- use reverse to find from right
        substring(
            reverse(col), 
            patindex(               -- finding first char that is not `0`
                '%[^0]%', 
                reverse(col)) + 
            patindex(               -- finding first char that is not `.` after removing trailing `0`s
                '%[^.]%', 
                substring(          -- remove trailing `0`s
                    reverse(col), 
                    patindex('%[^0]%', reverse(col)), 
                    len(col)) + 'x') - 1,     -- Note: I add `'x'` to avoid error
            len(col)))
from t;

SQL Server Fiddle Demo