2

我觉得很简单。

我有一个显示项目长度的查询。

询问:

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 个小数点?

所以想要的输出是3and6而不是3.0and6.0

我正在使用 MSSQL 2012。

4

4 回答 4

5

另一种变体(小提琴

;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 
于 2013-07-10T11:10:42.260 回答
2

为什么不

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

它解决了你的问题吗?

于 2013-07-10T13:29:04.577 回答
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
于 2013-07-10T11:02:45.400 回答
1

我认为这会起作用:

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

我假设长度的数据类型为数字(?,1)。

于 2013-07-10T11:23:34.757 回答