Проверить числовое значение? - PullRequest
3 голосов
/ 19 декабря 2011

Данные о поставщиках, которые мы загружаем в нашу промежуточную таблицу, довольно грязные. В частности, один столбец содержит числовые данные, но в 40% случаев в нем содержатся символы мусора или случайные строки.

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

select replace(translate(upper(str),' ','all possible char'),' ','')
from table

но происходит сбой всякий раз, когда встречается символ, который я не кодировал. Поэтому отчет никогда не может быть автоматизирован.

Javascript имеет функцию isNaN () для определения, является ли значение недопустимым числом (True, если оно есть, и false, если нет).

Как я могу сделать то же самое с DB2? У вас есть идеи?

Заранее спасибо.

Ответы [ 3 ]

11 голосов
/ 19 декабря 2011

Довольно надежный (но несколько хакерский) способ - сравнить строку с ее верхним и нижним регистром (числа не имеют разных регистров). Пока ваши данные, содержащие символы, содержат только латинские символы, с вами все будет в порядке:

SELECT input, CASE
    WHEN UPPER(input) = LOWER(input) THEN TO_NUMBER(input)
    ELSE 0
END AS output
FROM source

Другой вариант - использовать функцию TRANSLATE:

SELECT input,
    CASE 
        WHEN TRANSLATE(CAST(input as CHAR(10)), '~~~~~~~~~~~~~', '0123456789-. ') = '~~~~~~~~~~' THEN CAST(input AS DECIMAL(12, 2))
        ELSE 0
    END AS num
FROM x
2 голосов
/ 21 декабря 2011
WITH x (stringval) AS 
(
VALUES ('x2'),(''),('2.2.'),('5-'),('-5-'),('--5'),('.5'),('2 2'),('0.5-'),(' 1 '),('2  '),('3.'),('-4.0')
)
SELECT stringval,
CASE WHEN (

-- Whitespace must not appear in the middle of a number 
-- (but trailing and/or leading whitespace is permitted)
RTRIM(LTRIM( stringval )) NOT LIKE '% %'

-- A number cannot start with a decimal point
AND LTRIM( stringval ) NOT LIKE '.%'

-- A negative decimal number must contain at least one digit between 
-- the negative sign and the decimal point
AND LTRIM( stringval ) NOT LIKE '-.%'

-- The negative sign may only appear at the beginning of the number
AND LOCATE( '-', LTRIM(stringval)) IN ( 0, 1 )

-- A number must contain at least one digit
AND TRANSLATE( stringval, '0000000000', '123456789') LIKE '%0%'

-- Allow up to one negative sign, followed by up to one decimal point
AND REPLACE( 
    TRANSLATE( RTRIM(LTRIM(stringval)), '000000000', '123456789'), 
    '0', '') IN ('','-','.','-.')
)
THEN 'VALID'
ELSE 'INVALID'
END AS stringisvalidnumber
FROM x
;
1 голос
/ 11 сентября 2013

Проверьте это:

SELECT Mobile, 
 TRANSLATE(Mobile, '~~~~~~~~~~', '0123456789') AS FirstPass, 
 TRANSLATE(TRANSLATE(Mobile, '~~~~~~~~~~', '0123456789'), '', '~') AS Erroneous, 
REPLACE(TRANSLATE(Mobile, '', TRANSLATE(TRANSLATE(Mobile, '~~~~~~~~~~', '0123456789'), '', '~')), ' ', '') AS Corrected 
 FROM Person WHERE Mobile <> '' FETCH FIRST 100 ROWS ONLY

Таблица «Персона», а поле, которое вы хотите проверить, «Мобильный». Если вы немного поработаете над этим, вы можете создать ОБНОВЛЕНИЕ для исправления всей таблицы

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