mssql display 1 decimal point if available, else show none

删除回忆录丶 提交于 2019-12-11 02:33:25

问题


Simple one I think.

I have a query that shows lengths of items.

Query:

select length from vw_OutstandingVsInStock1 OVI
LEFT JOIN Departments DEP
on OVI.Department COLLATE DATABASE_DEFAULT=DEP.Description
where OutstandingVolume>0.39 

This returns results like:

0.9
1.2
1.5
1.8
2.1
2.4
2.7
3.0
3.3
3.6...

In the case of 3.0 I want it to display as 3

so if no decimal value, show int with no decimals. if a decimal exists show decimal to 1 decimal point?

so desired output is 3 and 6 instead of 3.0 and 6.0

I am using MSSQL 2012.


回答1:


Another variant (Fiddle)

;WITH vw_OutstandingVsInStock1 (length)
     AS (SELECT 0.9 UNION ALL
         SELECT 1.2 UNION ALL
         SELECT 1.5 UNION ALL
         SELECT 1.8 UNION ALL
         SELECT 2.1 UNION ALL
         SELECT 2.4 UNION ALL
         SELECT 2.7 UNION ALL
         SELECT 3.0 UNION ALL
         SELECT 3.3 UNION ALL
         SELECT 3.6)
SELECT IIF(length % 1 = 0,
           CAST(length AS INT),
           CAST(length AS SQL_VARIANT))
FROM   vw_OutstandingVsInStock1 



回答2:


Can't think of anything cleaner than this at the moment. I've placed the literal values in a CTE, you would place your existing query there:

;With rowss(length) as (
select 0.9 union all select 1.2 union all select 1.5 union all select
       1.8 union all select 2.1 union all select 2.4 union all select
       2.7 union all select 3.0 union all select 3.3 union all select
       3.6
)
select
    STUFF(stLength,CHARINDEX('.',stLength),
        CASE WHEN stLength like '%.0' THEN 2 ELSE 0 END,'')
from
    (select CONVERT(varchar(10),length) as stLength from rowss) t

The trick is to use STUFF and to decide, based on how the string ends, to either delete 2 characters or do nothing.

Result:

0.9
1.2
1.5
1.8
2.1
2.4
2.7
3
3.3
3.6



回答3:


I think this would work:

SELECT 
  CASE WHEN RIGHT(length,1) = 0 THEN STUFF(length, LEN(length)-1, 2, '') 
  ELSE STUFF(length, LEN(length), 0, '') 
  END

I assumed the length has data type numeric(?,1).




回答4:


Why not

select cast(length as float) from vw_OutstandingVsInStock1 OVI
...

Does it solve your problem?



来源:https://stackoverflow.com/questions/17568354/mssql-display-1-decimal-point-if-available-else-show-none

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!