Определить максимальную десятичную шкалу, используемую в столбце - PullRequest
14 голосов
/ 24 января 2012

В MS SQL мне нужен подход для определения наибольшего масштаба, используемого строками для определенного десятичного столбца.

Например, десятичное число Col1 (19,8) имеет шкалу 8, но мне нужно знать, действительно ли используются все 8, или используются только 5, 6 или 7.

Пример данных:

123.12345000
321.43210000
5255.12340000
5244.12345000

Для приведенных выше данных мне нужно, чтобы запрос возвращал 5, или 123.12345000, или 5244.12345000.

Меня не беспокоит производительность, я уверен, что будет полное сканирование таблицы, мне просто нужно выполнить запрос один раз.

Ответы [ 4 ]

10 голосов
/ 24 января 2012

Не красиво, но я думаю, что это должно сработать:

-- 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))
8 голосов
/ 24 января 2012

Мне больше нравится @ ответ Майкла Фредриксона , и я публикую его только в качестве альтернативы для конкретных случаев, когда фактический масштаб неизвестен, но наверняка будет не более 18:

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

Обратите внимание, что, хотя здесь есть два явных вызова CAST, запрос фактически выполняет еще два неявных преобразования:

  1. В качестве аргумента REVERSE, Col1 преобразуется в строку.

  2. bigint приводится в виде строки перед использованием в качестве аргумента LEN.

0 голосов
/ 09 декабря 2016

Обратите внимание, это будет сканировать всю таблицу:

SELECT TOP 1 [Col1] 
FROM [Table]
ORDER BY LEN(PARSENAME(CAST([Col1] AS VARCHAR(40)), 1)) DESC 
0 голосов
/ 22 ноября 2016
SELECT
    MAX(CHAR_LENGTH(
        SUBSTRING(column_name::text FROM '\.(\d*?)0*$')
    )) AS max_scale
FROM table_name;

*? - это не жадная версия *, поэтому \d*? перехватывает все цифры после десятичной точки, кроме конечных нулей.

Шаблон содержит пару скобок, поэтомувозвращается часть текста, которая соответствует первому заключенному в скобки подвыражению (то есть \d*?).

Ссылки:

...