SQL - Как я могу получить только цифры после десятичной дроби? - PullRequest
42 голосов
/ 05 августа 2010

Как получить только цифры после десятичной дроби?

Пример: 2.938 = 938

Ответы [ 10 ]

123 голосов
/ 05 августа 2010

попробуйте это:

SELECT (num % 1)
53 голосов
/ 05 августа 2010

в одну сторону, работает и для отрицательных значений

declare @1 decimal(4,3)
select @1 = 2.938

select PARSENAME(@1,1)
15 голосов
/ 05 августа 2010

Вы можете использовать FLOOR:

select x, ABS(x) - FLOOR(ABS(x))
from (
    select 2.938 as x
) a

Выход:

x                                       
-------- ----------
2.938    0.938

Или вы можете использовать SUBSTRING:

select x, SUBSTRING(cast(x as varchar(max)), charindex(cast(x as varchar(max)), '.') + 3, len(cast(x as varchar(max))))
from (
    select 2.938 as x
) a
6 голосов
/ 16 июля 2014

Более обобщенным подходом может быть слияние PARSENAME и% operator. (как ответили в двух из ответов выше)

Результаты согласно 1-му подходу, описанному выше SQLMenace

select PARSENAME(0.001,1) 

Результат: 001

select PARSENAME(0.0010,1) 

Результат: 0010

select PARSENAME(-0.001,1)

Результат: 001

select PARSENAME(-1,1)

Результат: -1 -> Не должен возвращать целочисленную часть

select PARSENAME(0,1)

Результат: 0

select PARSENAME(1,1)

Результат: 1 -> Не должен возвращать целую часть

select PARSENAME(100.00,1)

Результат: 00

Результаты по 1-му заходу выше Павла Моршенюка «0» является частью результата в этом случае.

SELECT (100.0001 % 1)

Результат: 0,0001

SELECT (100.0010 % 1)

Результат: 0,0010

SELECT (0.0001 % 1)

Результат: 0,0001

SELECT (0001 % 1)

Результат: 0

SELECT (1 % 1)

Результат: 0

SELECT (100 % 1)

Результат: 0

Сочетание обоих:

SELECT PARSENAME((100.0001 % 1),1)

Результат: 0001

SELECT PARSENAME((100.0010 % 1),1)

Результат: 0010

SELECT PARSENAME((0.0001 % 1),1)

Результат: 0001

SELECT PARSENAME((0001 % 1),1)

Результат: 0

SELECT PARSENAME((1 % 1),1)

Результат: 0

SELECT PARSENAME((100 % 1),1)

Результат: 0

Но все еще остается одна проблема - это ноль после того, как ненулевые числа являются частью результата (пример: 0,0010 -> 0010). Может быть, придется применить какую-то другую логику, чтобы удалить это.

4 голосов
/ 05 августа 2010

Обычный хак (немного различающийся по синтаксису) -

x - floor(x)

Это дробная часть. Чтобы получить целое число, масштабируйте его.

(x - floor(x)) * 1000
1 голос
/ 23 мая 2013

Сделать это очень просто по запросу:

select substr('123.123',instr('123.123','.')+1, length('123.123')) from dual;

Вместо этого введите свой номер или имя столбца 123.122

0 голосов
/ 20 августа 2015

Если вы хотите выбрать только десятичные числа, используйте это предложение WHERE:

    (CAST(RIGHT(Myfield, LEN( Myfield)-CHARINDEX('.',Myfield)+1 ) AS FLOAT)) <> 0

Если вы хотите очистить список, вы можете отсортировать по десятичному / целому числу:

    CASE WHEN 0 = CAST(RIGHT(Myfield, LEN( Myfield)-CHARINDEX('.',Myfield)+1 ) AS FLOAT) THEN 'Integer' ELSE 'Decimal' END AS Type
0 голосов
/ 22 октября 2014

CAST (ВПРАВО (MyField, LEN (MyField) -CHARINDEX ('.', MyField) +1) ПО ПЛАВУ)

0 голосов
/ 10 июня 2014

Вы можете использовать ПРАВО:

 select RIGHT(123.45,2) return => 45
0 голосов
/ 05 августа 2010

Если вы знаете, что хотите, чтобы значения были тысячными, поместите, это будет

SELECT (num - FLOOR(num)) * 1000 FROM table...;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...