Я хочу экспортировать данные из базы данных Oracle в CSV, и я помещаю числовой фильтр в столбец varchar. Это ORA: 01722 ошибка. Пожалуйста, предложите - PullRequest
0 голосов
/ 03 июля 2018
Select count(*) from table where loc between 300 to 400. 
  1. loc - столбец Варчара.
  2. это не выбор всех данных
  3. проверяя счет, выдает ORA: 01722 ошибка
  4. экспорт результатов с ошибкой.

Редактировать из комментария:

loc содержит значения меньше 300, больше 400, и буквенно-цифровой, как 'GT', '3KT1'

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

loc - столбец Варчара.
[Из комментария] Столбец Loc имеет значение типа char также как GJ, 3KT1

LOC содержит значения, которые нельзя преобразовать в числа. Это важно, поскольку предикаты вашего предложения WHERE определены как числа, поэтому Oracle применяет к запросу неявный to_number(loc). Вот почему использование правильных типов данных является наилучшей практикой: сейчас это не поможет, но, пожалуйста, усвойте урок и используйте столбцы NUMBER для числовых данных.

Тем временем у вас есть несколько вариантов работы с вашей тонкой моделью данных.

Если вам посчастливилось использовать Oracle 12c R2, вы можете использовать новую функцию VALIDATE_CONVERSION(), чтобы исключить значения loc, которые нельзя привести к числам. Узнать больше

Если вы используете более раннюю версию Oracle, вы можете создать свою собственную функцию:

create or replace function is_number
    (p_str in varchar2) return number 
is 
    n number;
    rv number;
begin 
    begin
        n := to_number(p_str);
        rv := 1;
    exception
        when invalid_number then
             rv := 0;
    end;
    return rv;
end;

Самым слабым вариантом будет приведение предикатов к строкам. where loc between '300' to '400' будет включать '3000', '4' и различные другие значения, которые вы, вероятно, не хотите.

Вот демонстрационная версия LiveSQL (требуется бесплатная учетная запись Oracle Technet, увы) .

0 голосов
/ 03 июля 2018

Ваш текущий запрос пытается сравнить varchar с числом. Поэтому он пытается конвертировать varchar в число на лету. Это называется неявным преобразованием.

Вы должны сравнить varchar с varchar.

Используйте одинарные кавычки, чтобы сравнивать их с varchars, а не с цифрами

Select count(*) from table where loc between '300' to '400'

Тогда иди и прочитай о неявном преобразовании

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

Однако вам нужно выяснить, правильно ли вы храните разные типы данных в одном столбце

...