Oracle преобразует столбец varchar / hex в числовой формат после загрузки данных из файла xlsx - PullRequest
0 голосов
/ 13 июня 2019

Я загрузил файл Excel в таблицу и обнаружил, что некоторые данные в моем поле varchar2 имеют формат HEX.

Когда я выполняю свой запрос, у меня нет проблем, но когда я пытаюсь вставить свойданные в другую таблицу с числовым форматом не работают.

Этот запрос показывает, какой столбец имеет формат HEX:

SELECT qty, TO_NUMBER(REPLACE(qty, CHR(32), '')) as nbkg, RAWTOHEX(qty) as Graphics 
FROM (
  SELECT nvl(qty, 0) AS qty,
    case
        when pkg_tools.f_is_number(qty) = 1 then 'OK'
        else 'NOK'
    end kg
  FROM table
) 
WHERE kg = 'NOK';

*qty is a varchar2(50)

Мой вывод:

qty  nbkg  Graphics
---  ----  --------
10 009,000    10009,000    3130203030392C303030  -- work
3 250,00    3250,00    33203235302C3030   -- work
1 000,00    1000,00    31203030302C3030   -- work
1 230,00    1 230,00    31A03233302C3030  -- Not work
1 750,00    1 750,00    31A03735302C3030  -- Not work
4 000,00    4 000,00    34A03030302C3030  -- Not work
1 980,00    1 980,00    31A03938302C3030  -- Not work
1 050,00    1 050,00    31A03035302C3030  -- Not work
1 050,00    1 050,00    31A03035302C3030  -- Not work
1 000,00    1 000,00    31A03030302C3030  -- Not work
39 950,00    39 950,00    3339A03935302C3030 -- Not work
3 000,00    3 000,00    33A03030302C3030  
...
...

Я пытаюсь преобразовать его в число перед тем, как вставить свои данные:

SELECT TO_NUMBER(REPLACE(qty, CHR(32), '')) 
FROM table;

SELECT TO_NUMBER(REGEXP_REPLACE(qty, '\s'))
FROM table;

, и я получаю сообщение об ошибке: ORA-01722: invalid number

Как мне преобразовать этот столбец varchar / hexв числовой формат?

Спасибо.

1 Ответ

1 голос
/ 13 июня 2019

добавить маску формата и информацию NLS с помощью функции to_number.

, чтобы она выглядела так:

select to_number('1 250,000','999G999G999D99999','NLS_NUMERIC_CHARACTERS='', ''') as n
from dual

, если вы проверите шестнадцатеричное значение, например, 31A03030302C3030, вы можетесм. A0 на второй позиции.это отображается как пустая строка, но это  , а не пробел с шестнадцатеричной позицией 20 в таблице ASCII.Так что просто замените этот 160 на 32

to_number(replace('1 250,000',chr(160),chr(32)),'999G999G999D99999','NLS_NUMERIC_CHARACTERS='', ''') as n

результат:

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