Я хочу посмотреть, какое значение выше A или B. Это строки, но большинство строк содержат только числа. мне нужно преобразовать эти числа, чтобы я мог использовать операторы > и <.
Они не хотят, чтобы я создавал функцию в «их» базе данных. Так что это не вариант. Я попробовал Лукаш Шозда, его подход к "Безопасно" TO_NUMBER(), но это просто дает мне «Отсутствует правая скобка».
Я пробовал https://docs.oracle.com/cd/E51367_01/financialsop_gs/FADRA/ch09s05s53.html Тоже никаких успехов.
И я пробовал с REGEX, но тоже не повезло.
SELECT *
FROM Table
WHERE
(
TO_NUMBER('T' DEFAULT 0 ON CONVERSION ERROR)
>
TO_NUMBER('5' DEFAULT 0 ON CONVERSION ERROR)
)
SELECT *
FROM Table
WHERE
(
TO_NUMBER('7' DEFAULT 0 ON CONVERSION ERROR)
>
TO_NUMBER('5' DEFAULT 0 ON CONVERSION ERROR)
)
Первый бит кода ничего не должен возвращать, второй всю таблицу. Но все, что я получаю, это "Отсутствует правая скобка"
Oracle Database 11g, выпуск 11.2.0.4.0 — 64-разрядная версия
Если они не хотят, чтобы вы создавали функцию в «их» базе данных, попросите «их» создать ее от вашего имени.
Материал «при ошибке преобразования» был добавлен в 12cR2, как сказано в ответе Лукаша; вы получаете сообщение об ошибке, потому что это недопустимый синтаксис в 11g. И 11g означает, что вы также не можете использовать локальную функцию, определенную в CTE. Подход с регулярными выражениями может работать, но, поскольку вы не показали свою попытку или почему она не сработала, мы не можем помочь вам это исправить.
@AlexPoole, я так же боялся ... любой доступный вариант?





Как отмечено в ответе Лукаша на вопрос, на который вы ссылались, синтаксис on conversion error был добавлено в 12cR2, поэтому вы не можете использовать его в 11gR2 - это причина ошибки, которую вы получаете.
Однако метод регулярного выражения, описанный в этом вопросе, работает:
SELECT *
FROM dual
WHERE
(
COALESCE(TO_NUMBER(REGEXP_SUBSTR('T', '^\d+')), 0)
>
COALESCE(TO_NUMBER(REGEXP_SUBSTR('5', '^\d+')), 0)
);
no rows selected
SELECT *
FROM dual
WHERE
(
COALESCE(TO_NUMBER(REGEXP_SUBSTR('7', '^\d+')), 0)
>
COALESCE(TO_NUMBER(REGEXP_SUBSTR('5', '^\d+')), 0)
);
D
-
X
По какой-то причине точка с запятой выдает ошибку «Недопустимый символ», но без нее, похоже, пока работает. Собираюсь закончить более сложный запрос, который я подаю, чтобы работать с этим и посмотреть, работает ли он :) Спасибо.
Точка с запятой — это разделитель операторов, у меня 20 лет мышечной памяти от работы с SQL*Plus, поэтому я добавляю ее автоматически. Но да, в другом клиенте, или с другими настройками, или через JDBC и т. д. - это не часть оператора, поэтому он получит эту ошибку.
Немного продолжения: что, если я хочу получить исходное значение, если это не число? Попытался заменить 0 используемой переменной, но получил «несогласованные типы данных: ожидаемое число получило CHAR», что очевидно. Любая работа для этого (не имеет большого значения, просто аккуратное дополнение), потому что единственный способ, который я могу придумать, - это каким-то образом преобразовать число обратно в char после завершения сравнения.
Вы либо сравниваете значения как числа, и в этом случае нечисловые значения не могут быть включены; или вы обрабатываете все как строки, что, очевидно, не будет сортировать числовые значения в числовом порядке. Их нельзя смешивать. Как бы вы хочу сравнили «число» и строку (например, T и 5, я полагаю)? Вы, мог, я полагаю, нормализуете числа обратно в строки фиксированной длины, дополненные нулями (если они целые), но это звучит не очень хорошо. Наверное, я не очень понимаю, чего вы пытаетесь достичь.
Какая версия Оракла?