Sql server SQL Server-删除前导零和尾随零

Sql server SQL Server-删除前导零和尾随零,sql-server,tsql,sql-server-2012,Sql Server,Tsql,Sql Server 2012,我需要从数据集中删除前导零和尾随零: WITH data as ( select 0.10 ITEM union all select -1.00 union all select 0.20 union all select 2.00 union all select 508000015.00 ) 因此,结果类似于: ITEM .1 -1 .2 2 508000015 有没有更简洁或更有效的方法 SELECT cas

我需要从数据集中删除前导零和尾随零:

WITH

data as (
    select 0.10 ITEM
    union all
    select -1.00
    union all
    select 0.20
    union all
    select 2.00
    union all
    select 508000015.00
)
因此,结果类似于:

ITEM
.1
-1
.2
2
508000015
有没有更简洁或更有效的方法

SELECT  case
          # if item isn't an integer, trim 0 from left and right 
          when item % 1 = item then REPLACE(RTRIM(LTRIM(REPLACE(item,'0',' '))),' ','0') 
          else cast(cast(item as int) as varchar) 
        end VALUE
FROM    data

试试像

WITH data as (
    select 0.10 ITEM
    union all
    select -1.00
    union all
    select 0.20
    union all
    select 2.00
    union all
    select 508000015.00
)
Select CASE WHEN RIGHT( REPLACE(RTRIM(LTRIM(REPLACE(ITEM,'0',' '))),' ','0'), 1) = '.'
           THEN REPLACE(REPLACE(RTRIM(LTRIM(REPLACE(ITEM,'0',' '))),' ','0'),'.','')
           ELSE REPLACE(RTRIM(LTRIM(REPLACE(ITEM,'0',' '))),' ','0') END
from data

类似的方法也可以奏效:

WITH
data as (
    select 0.10 ITEM
    union all
    select -1.00
    union all
    select 0.20
    union all
    select 2.00
    union all
    select 508000015.00
)
SELECT  *
FROM    data as d
CROSS
APPLY   (SELECT 
                SUBSTRING(CAST(ITEM AS varchar(32)), PATINDEX('0%', CAST(ITEM AS VARCHAR(32))) + 1, LEN(ITEM))) AS f (lead0) -- remove leading 0
CROSS
APPLY   (SELECT 
                SUBSTRING(f.lead0, 1, CASE 
                                        WHEN RIGHT(f.lead0, 2) = '00' THEN LEN(f.lead0) - 3 -- remove decimal point as well
                                        WHEN RIGHT(f.lead0, 1) = '0' THEN LEN(f.lead0) - 1 
                                        ELSE LEN(f.lead0) 
                                    END)) AS s (end0);

如果将数据存储在(12,2)列中,则无所谓。SQL Server将始终显示小数点后两位的内容

SELECT
    CAST(1.0 AS NUMERIC(12, 2))     AS [NoDp],
    CAST(1.0 AS NUMERIC(12, 2))     AS [1Dp],
    CAST(1.00 AS NUMERIC(12, 2))    AS [2Dp],
    CAST(1.000 AS NUMERIC(12, 2))   AS [3Dp]
;
返回

NoDp    1Dp     2Dp     3Dp
1.00    1.00    1.00    1.00

如果您对格式化输出感兴趣,最好在表示层完成。

我认为这可能更简单。抱歉有点懒,但我想你会明白的

WITH data as (
 select 0.10 ITEM
 union all
 select -1.00
 union all
 select 0.20
 union all
 Select 2.00
 union all
 select 508000015.00
 union all
 select 508015
 union all
 select 50815)

set1 as (Select
case when LEN(item) > 6 then cast(cast(item as numeric) as varchar)
else cast(cast(item as float) as varchar)
end item
from data)

select
case
    when item like '0.%' then RIGHT(item,len(item)-1) else item
end As item
from set1

项目的数据类型是什么?是否有不需要尾随零的简明理由?有效数字或格式是否更重要?在这里,以数字、整数甚至浮点值存储似乎是有意义的,除非您打算将其作为文本保存。@BrownRedHawk,供应商的数据库是所讨论字段的字符串和数字值的混合体。此外,所需的表示与UI的表示相匹配。