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