在MS SQL中,我需要一种方法来确定某个十进制列的行使用的最大比例。
例如,Col1 Decimal(19,8)的比例为8,但我需要知道是否所有8个实际上都在使用,或者是否只使用了5,6或7。
样本数据:
123.12345000
321.43210000
5255.12340000
5244.12345000
对于上面的数据,我需要查询返回5,或123.12345000或5244.12345000。
我不关心性能,我确定全表扫描会有序,我只需要运行一次查询。
在MS SQL中,我需要一种方法来确定某个十进制列的行使用的最大比例。
例如,Col1 Decimal(19,8)的比例为8,但我需要知道是否所有8个实际上都在使用,或者是否只使用了5,6或7。
样本数据:
123.12345000
321.43210000
5255.12340000
5244.12345000
对于上面的数据,我需要查询返回5,或123.12345000或5244.12345000。
我不关心性能,我确定全表扫描会有序,我只需要运行一次查询。
不漂亮,但我认为应该这样做:
-- 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))
不漂亮,但我认为应该这样做:
-- 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))
我喜欢 @Michael Fredrickson的回答 更好,我只发布此作为特定情况的替代方案,其中实际规模未知但肯定不超过18:
SELECT LEN(CAST(CAST(REVERSE(Col1) AS float) AS bigint))
请注意,尽管此处有两个显式CAST调用,但查询实际上还执行了两次隐式转换:
作为REVERSE的论据, Col1
转换为字符串。
该 bigint
在被用作LEN的参数之前被强制转换为字符串。
SELECT
MAX(CHAR_LENGTH(
SUBSTRING(column_name::text FROM '\.(\d*?)0*$')
)) AS max_scale
FROM table_name;
*?
是非贪婪的版本 *
所以 \d*?
捕获小数点后的所有数字,除了尾随零。
该模式包含一对括号,因此文本中与第一个带括号的子表达式匹配的部分(即 \d*?
)被退回。
参考文献:
请注意,这将扫描整个表:
SELECT TOP 1 [Col1]
FROM [Table]
ORDER BY LEN(PARSENAME(CAST([Col1] AS VARCHAR(40)), 1)) DESC