我认为很简单。
我有一个显示项目长度的查询。
查询:
select length from vw_OutstandingVsInStock1 OVI
LEFT JOIN Departments DEP
on OVI.Department COLLATE DATABASE_DEFAULT=DEP.Description
where OutstandingVolume>0.39
这会返回如下结果:
0.9
1.2
1.5
1.8
2.1
2.4
2.7
3.0
3.3
3.6...
如果是3.0
,我希望它显示为3
因此,如果没有小数值,则显示int
没有小数。如果存在十进制显示十进制到1小数点?
所以期望的输出是3
和6
而不是3.0
和6.0
我正在使用MSSQL 2012。
答案 0 :(得分:5)
另一种变体(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
答案 1 :(得分:1)
目前想不出比这更干净的东西了。我已将文字值放在CTE中,您可以将现有查询放在那里:
;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
诀窍是使用STUFF
并根据字符串的结束方式决定删除2个字符或不执行任何操作。
结果:
0.9
1.2
1.5
1.8
2.1
2.4
2.7
3
3.3
3.6
答案 2 :(得分:1)
我认为这样可行:
SELECT
CASE WHEN RIGHT(length,1) = 0 THEN STUFF(length, LEN(length)-1, 2, '')
ELSE STUFF(length, LEN(length), 0, '')
END
我假设长度的数据类型为数字(?,1)。
答案 3 :(得分:1)
为什么不
select cast(length as float) from vw_OutstandingVsInStock1 OVI
...
它能解决你的问题吗?