确定列上使用的MAX十进制比例

时间:2012-01-23 20:26:38

标签: sql sql-server tsql decimal precision

在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 个答案:

答案 0 :(得分:9)

不漂亮,但我认为应该这样做:

-- 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))

答案 1 :(得分:6)

我更喜欢@Michael Fredrickson's answer,而且我只是将其作为实际比例未知但确定不超过18的特定情况的替代方案:

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

请注意,虽然此处有两个显式CAST调用,但查询实际上执行了两次隐式转换:

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

  2. bigint在被用作LEN的参数之前被强制转换为字符串。

答案 2 :(得分:0)

SELECT
    MAX(CHAR_LENGTH(
        SUBSTRING(column_name::text FROM '\.(\d*?)0*$')
    )) AS max_scale
FROM table_name;

*?*的非贪婪版本,因此\d*?会捕获小数点后的所有数字,除了尾随零。

模式包含一对圆括号,因此返回与第一个带括号的子表达式(即\d*?)匹配的文本部分。

参考文献:

答案 3 :(得分:0)

请注意,这将扫描整个表格:

SELECT TOP 1 [Col1] 
FROM [Table]
ORDER BY LEN(PARSENAME(CAST([Col1] AS VARCHAR(40)), 1)) DESC