在MS SQL中,我需要一种方法来确定某个十进制列的行使用的最大比例。
例如Col1 Decimal(19,8)的比例为8,但我需要知道是否所有8个实际上都在使用,或者是否只使用了5,6或7个。
示例数据:
123.12345000
321.43210000
5255.12340000
5244.12345000
对于上面的数据,我需要查询返回5,或123.12345000或5244.12345000。
我不关心性能,我确定全表扫描会有序,我只需要运行一次查询。
答案 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调用,但查询实际上执行了两次隐式转换:
作为REVERSE的参数,Col1
被转换为字符串。
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