Oracle: преобразование столбца Varchar в число с плавающей точкой - PullRequest
0 голосов
/ 15 января 2019

Я пытаюсь очистить плохо спроектированную таблицу с приблизительно 12 000 строк. В таблице сохраняются введенные пользователем данные в виде varchar. Мне было интересно, если бы был способ преобразовать весь столбец в float и лишить постороннего текста. Столбец имеет нулевые значения, текстовые значения и числа, которые хранятся в виде текста.

| Score   |
|---------|
| 1       |
| 2       |
| 2       |
| 3       |
| 300 EOW |
| 5.5     |
| (null)  |
| N/A     |
| 200     |

Я попытался использовать следующую команду, но в итоге получил ошибку ORA-01722.

TO_NUMBER(NVL(score,'0'),'9999D99','nls_numeric_characters=,.') 

Любые предложения о том, как мы можем очистить данные?

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Простым решением без использования функции было бы использование регулярного выражения для удаления нечисловых символов перед преобразованием, например:

TO_NUMBER( 
    NVL(REGEXP_REPLACE(score, '[^1-9.]', ''), 0),
    '9999D99',
    'nls_numeric_characters='.'
)

Объяснение регулярного выражения:

[        # any character
  ^      # other than
  1-9    # 1, 2, 3,  ..., 9
  .      # and character . (dot)
]

Примечание: если у вас есть числа в нескольких местах в строке, они в конечном итоге соединяются вместе, а затем преобразуются в число. В вашем случае есть и другие возможные варианты, например, использовать что-то вроде REGEXP_SUBSTR(score, '[1-9.]'), чтобы захватить первое число в строке.

0 голосов
/ 15 января 2019

Если вы установите эту функцию в списке: http://techonthenet.com/oracle/questions/isnumeric.php

Затем вы можете позвонить по номеру is_number

CASE WHEN is_number(<EXPRESSION>) = 1 THEN TO_NUMBER(<SAME EXPRESSION>) ELSE 0 END

Ссылочная функция:

CREATE FUNCTION is_number (p_string IN VARCHAR2)
   RETURN INT
IS
   v_new_num NUMBER;
BEGIN
   v_new_num := TO_NUMBER(p_string);
   RETURN 1;
EXCEPTION
WHEN VALUE_ERROR THEN
   RETURN 0;
END is_number;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...