确定列上使用的最大十进制精度

15
在 MS SQL 中,我需要一种方法来确定某个十进制列的行正在使用的最大精度。
例如,Col1 Decimal(19,8) 的精度为 8,但我需要知道是否实际上使用了全部 8 个精度位,还是只使用了其中的 5、6 或 7 个。
示例数据:
123.12345000
321.43210000
5255.12340000
5244.12345000
对于上面的数据,我需要查询要么返回5,要么返回123.12345000或5244.12345000。
我不关心性能,肯定需要进行完整的表扫描,我只需要运行一次查询。
4个回答

10

不太美观,但我认为它应该能解决问题:

-- Find the first non-zero character in the reversed string...
-- And then subtract from the scale of the decimal + 1.
SELECT 9 - PATINDEX('%[1-9]%', REVERSE(Col1))

不太好看,但是非常出色。像魔法一样运行。只需添加MAX()并过滤掉0.00000000。添加MAX()后,我得到了:SELECT MAX(9 - PATINDEX('%[1-9]%', REVERSE(Col1)))。 - Bo Flexson

8

我更喜欢@Michael Fredrickson的答案,但这里提供了一个特定情况下的替代方案,即实际比例未知但肯定不超过18的情况:

SELECT LEN(CAST(CAST(REVERSE(Col1) AS float) AS bigint))

请注意,尽管这里有两个明确的CAST调用,但查询实际上执行了另外两个隐式转换:

  1. 作为REVERSE的参数,Col1被转换为字符串。

  2. 在用作LEN参数之前,将bigint转换为字符串。


你帮忙找到了这个解决方案:https://dev59.com/F2Uq5IYBdhLWcg3wMNgK#14715318 我不得不更进一步,并使用这个人的帖子才得以解决:http://connectsql.blogspot.com.br/2011/04/normal-0-microsoftinternetexplorer4.html 很有趣,我们通过收集各处的信息碎片来构建一个解决方案... :D - Leniel Maccaferri

-1

-1
请注意,这将扫描整个表格:
SELECT TOP 1 [Col1] 
FROM [Table]
ORDER BY LEN(PARSENAME(CAST([Col1] AS VARCHAR(40)), 1)) DESC 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接