我有一列X,其中包含小数点的浮点,范围从0(无小数)到6(最大).我可以指望没有大小小于6位的浮点数.鉴于此,我如何制作一个新列,以便告诉我十进制数字后面有几位数字?
我看到一些线程表明我使用CAST将float转换为字符串,然后解析该字符串来计算小数点后面的字符串的长度.这是最好的方式吗?
解决方法
你可以使用这样的东西:
declare @v sql_variant set @v=0.1242311 select sql_VARIANT_PROPERTY(@v,'Scale') as Scale
这将返回7.
我试图使上面的查询使用一个float列,但无法使其按预期工作.它只适用于sql_variant列,如下所示:http://sqlfiddle.com/#!6/5c62c/2
所以,我继续寻找另一种方式,并建立在这个answer,我得到了:
SELECT value,LEN( CAST( CAST( REVERSE( CONVERT(VARCHAR(50),value,128) ) AS float ) AS bigint ) ) as Decimals FROM Numbers
这是一个sql小提琴来测试这个:http://sqlfiddle.com/#!6/23d4f/29
为了解释这个小怪物,这里是一个修改版本,当浮点值没有小数部分时,它将处理这种情况:
SELECT value,Decimals = CASE Charindex('.',value) WHEN 0 THEN 0 ELSE Len ( Cast( Cast( Reverse(CONVERT(VARCHAR(50),128)) AS FLOAT ) AS BIGINT ) ) END FROM numbers
这是附带的sql小提琴:http://sqlfiddle.com/#!6/10d54/11