转换varchar(8)值并在T-SQL中使用ASC

时间:2011-08-29 06:29:05

标签: sql tsql sql-server-2008

我在下表中的表中有一个数据,它在varchar(8)数据类型中

总计

100
101
104.5
88
1038
64
108.3
10872
900

我喜欢在T-sql中使用ASC,这样我就能按升序显示它,不过我 不能这样做,因为它是在varchar(8)形式

例如

select Total from
Table A
Order by Total ASC

如何首先将这些值添加到临时临时表中? 以及如何将此varchar(8)值转换为什么?以便 您可以使用T-SQL查询以ASC或升序显示它们吗? 任何人吗?

5 个答案:

答案 0 :(得分:1)

您可以像这样投射价值。

SELECT 
    Total 
FROM Table A
ORDER BY CAST(Total AS FLOAT) ASC

答案 1 :(得分:1)

示例中的值看起来像浮点数。所以

1)由于它们都不超过8位数,因此可以将其转换为浮点数(53)(精度约为15位小数),而不会丢失数据。或小数(15,7)完全确定。

2)通常,将浮点值存储为数据库中的字符串是很奇怪的。

答案 2 :(得分:1)

您可能会丢失转换回浮动的数据。

所以这是一个基于varchar的排序。

DECLARE @badDesign TABLE (floatcol varchar(8) NOT NULL);
INSERT @badDesign VALUES ('100'),('101'),('104.5'),('88'),('1038'),('64'),('108.3'),('10872'),('900'),('108'), ('108.32'), ('108.4')

SELECT *
FROM @badDesign
ORDER BY
   RIGHT('00000000' +
       CASE
           WHEN CHARINDEX('.', floatcol) = 0 THEN floatcol
           ELSE LEFT(floatcol, CHARINDEX('.', floatcol)-1)
       END
       , 8),
   CASE
       WHEN CHARINDEX('.', floatcol) = 0 THEN '.0'
       ELSE SUBSTRING(floatcol, CHARINDEX('.', floatcol)+1, 8)
   END

答案 3 :(得分:0)

使用CASTCONVERT功能,例如:

select Total from
Table A
Order by CAST(Total as float) ASC

参考:http://msdn.microsoft.com/en-us/library/ms187928.aspx

答案 4 :(得分:0)

除非您想保留转换后的值,否则无需将其存储在临时表中。只需将它们转换为排序:

select Total
from [Table A]
order by cast(Total as float)

(升序是排序的默认方式,因此您无需指定。)