Sql server 获取浮点SQL Server 2012中的最大小数位数

Sql server 获取浮点SQL Server 2012中的最大小数位数,sql-server,floating-point,subquery,Sql Server,Floating Point,Subquery,据我所知,float存储为二进制,是SQL Server中的一种表示形式。但是,我需要表中浮点列中表示的最大小数位数。我发现这解释了如何获得每行的小数位数。但是,我不知道如何获得该结果的最大值。本质上这就是我想要做的 SELECT MAX (Decimals = CASE Charindex('.', [QUANTITY]) WHEN 0 THEN 0 ELSE Len (Cast(Cast(Re

据我所知,float存储为二进制,是SQL Server中的一种表示形式。但是,我需要表中浮点列中表示的最大小数位数。我发现这解释了如何获得每行的小数位数。但是,我不知道如何获得该结果的最大值。本质上这就是我想要做的

SELECT MAX
       (Decimals = CASE Charindex('.', [QUANTITY])
                    WHEN 0 THEN 0
                    ELSE
   Len (Cast(Cast(Reverse(CONVERT(VARCHAR(50), [QUANTITY], 128)
                     ) AS FLOAT) AS BIGINT))
                  END)
FROM   [schema].[table]

这给了我一个结束后的语法错误。我尝试了一个子查询,但似乎也无法获得正确的语法

看来这就是答案

SELECT MAX
       (CASE Charindex('.', [QUANTITY])
                    WHEN 0 THEN 0
                    ELSE
   Len (Cast(Cast(Reverse(CONVERT(VARCHAR(50), [QUANTITY], 128)
                     ) AS FLOAT) AS BIGINT))
                  END)
FROM   [schema].[table]
对不起大家。我想我在我的许多派生词中都尝试过这个,但显然没有,或者我有一个打字错误。如果有人能解释为什么放入“Decimals=”会使其无效,这将有助于我理解原因。

您可以将函数与
style=128
一起使用,但您可以看到,这是[
出于遗留原因而包含的,可能在未来版本中被弃用。另一种方法是使用函数:

declare @temp_data table (quantity float)

insert into @temp_data
select 1.55552 union all
select 0.545365788

;with cte as (
    select convert(varchar(max), quantity, 128) as quantity from @temp_data
)
select 
    max(
        case
            when charindex('.', quantity) = 0 then 0
            else len(quantity) - charindex('.', quantity)
        end
    )
from cte

;with cte as (
    select rtrim(ltrim(str(quantity, 100, 100))) as quantity from @temp_data
)
select
    max(
        case
            when charindex('.', quantity) = 0 then 0
            else len(cast(cast(reverse(quantity) as float) as bigint))
        end
    )
from cte
选择最大值(CASE Charindex('.',)
当0
然后
0
其他的
LEN(CAST(CAST(反向(转换(varchar(50),128))为float)为bigint))
结束
)AS[浮动精度]
, 
从…起
分组
按[FloatPrecision]DESC订购;

此解决方案提供浮点精度,实际值从最精确到最小。在我的例子中,有些成本值精确到了小数点后11位,这没有多大意义。

如果您试图命名结果列,那么名称应该在以下子句之后:
SELECT MAX(case…WHEN…END)作为…的小数。
SELECT   MAX ( CASE Charindex('.', <ColumnName>)
                  WHEN 0
                     THEN
                        0
                     ELSE
                        LEN( CAST( CAST( REVERSE( CONVERT( varchar(50), <ColumnName>, 128 ) ) AS float) AS bigint))
               END
             ) AS [FloatPrecision]
       , <ColumnName>
   FROM <schema>.<tablename>
   GROUP BY <ColumnName>
   ORDER BY [FloatPrecision] DESC;