SQL Server - АКТИВНЫЙ И РАЗДЕЛИТЬ - PullRequest
1 голос
/ 11 марта 2010
DECLARE @table table(XYZ VARCHAR(8) , id int)

INSERT INTO @table
SELECT '4000', 1
UNION ALL
SELECT '3.123', 2
UNION ALL
SELECT '7.0', 3
UNION ALL
SELECT '80000', 4
UNION ALL
SELECT NULL, 5

Запрос:

SELECT CASE 
         WHEN PATINDEX('^[0-9]{1,5}[\.][0-9]{1,3}$', XYZ) = 0 THEN XYZ
         WHEN PATINDEX('^[0-9]{1,8}$',XYZ) = 0 THEN CAST(XYZ AS decimal(18,3))/1000
         ELSE NULL 
       END
  FROM @table

Эта часть - CAST(XYZ AS decimal(18,3))/1000 не делит значение.

Это дает мне больше нулей после десятичной дроби вместо деления. (Я даже заключил это в скобки и попробовал, но результат тот же).

Ex:2000/1000 = 2000.000000

Я что-то здесь не так делаю? Параметры выражения patindex верны?

Expected result:
4.000
3.123
7.000
80.000

Дайте мне знать, если PATINDEX не правильный метод для использования? Я пытаюсь проверить, является ли оно уже десятичным с 3 десятичными точками, иначе я хочу разделить на 1000.

Ответы [ 4 ]

1 голос
/ 11 марта 2010

попробуйте это, преобразовать весь CASE в десятичное число (18,3):

DECLARE @table table(XYZ VARCHAR(8) , id int)

INSERT INTO @table
SELECT '4000', 1
UNION ALL
SELECT '3.123', 2
UNION ALL
SELECT '7.0', 3
UNION ALL
SELECT '80000', 4
UNION ALL
SELECT NULL, 5


SELECT CONVERT(decimal(18,3),CASE --nothing changes within the CASE
                                 WHEN PATINDEX('^[0-9]{1,5}[\.][0-9]{1,3}$', XYZ) = 0 THEN XYZ
                                 WHEN PATINDEX('^[0-9]{1,8}$',XYZ) = 0 THEN CAST(XYZ AS decimal(18,3))/1000
                                 ELSE NULL 
                             END
              )
FROM @table

ВЫВОД:

---------------------------------------
4000.000
3.123
7.000
80000.000
NULL

(5 row(s) affected)
1 голос
/ 11 марта 2010

Попробуйте это ..

DECLARE @table table(XYZ VARCHAR(8) , id int)

INSERT INTO @table
SELECT '4000', 1
UNION ALL
SELECT '3.123', 2
UNION ALL
SELECT '7.0', 3
UNION ALL
SELECT '80000', 4
UNION ALL
SELECT NULL, 5
UNION ALL
SELECT 'WTF',6

SELECT CASE 
     WHEN ISNUMERIC(XYZ) = 0 THEN NULL
     WHEN CHARINDEX('.',XYZ,0) < LEN(XYZ)-2 AND CHARINDEX('.',XYZ,0) > 0 THEN XYZ
     WHEN ISNUMERIC(XYZ) >0  then  convert(decimal(18,3),xyz) / 1000.000
     ELSE NULL
END
  FROM @table

выход

4.00000000000
3.12300000000
0.00700000000
80.00000000000
NULL
NULL

Редактировать - чтобы сохранить до 3 десятичных знаков в выходных данных, сделайте это

SELECT convert(decimal(8,3),CASE 
     WHEN ISNUMERIC(XYZ) = 0 THEN NULL
     WHEN CHARINDEX('.',XYZ,0) < LEN(XYZ)-2 AND CHARINDEX('.',XYZ,0) > 0 THEN XYZ
     WHEN ISNUMERIC(XYZ) >0  then  convert(decimal(18,3),xyz) / 1000.000
     ELSE NULL
END)
  FROM @table

Обратите внимание, что (8,3) определяет это, общая точность 8 цифр, 3 после точки.

Возможно, вы захотите преобразовать обратно в varchar (8)

0 голосов
/ 11 марта 2010
select xyz, ((case when charindex('.', xyz) > 0 then cast(xyz AS decimal(18,3))*1000
                   else cast(xyz AS decimal(18,3)) end))/1000
from #table
0 голосов
/ 11 марта 2010

Деление на 1000 даст вам больше нулей после десятичного числа

5.3 / 1000 = .0053
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...