Альтернативы ISNumeric для Oracle

Я хочу посмотреть, какое значение выше 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)
)

Первый бит кода ничего не должен возвращать, второй всю таблицу. Но все, что я получаю, это "Отсутствует правая скобка"

Какая версия Оракла?

James 28.05.2019 12:55

Oracle Database 11g, выпуск 11.2.0.4.0 — 64-разрядная версия

user10086705 28.05.2019 12:57

Если они не хотят, чтобы вы создавали функцию в «их» базе данных, попросите «их» создать ее от вашего имени.

Kaushik Nayak 28.05.2019 12:59

Материал «при ошибке преобразования» был добавлен в 12cR2, как сказано в ответе Лукаша; вы получаете сообщение об ошибке, потому что это недопустимый синтаксис в 11g. И 11g означает, что вы также не можете использовать локальную функцию, определенную в CTE. Подход с регулярными выражениями может работать, но, поскольку вы не показали свою попытку или почему она не сработала, мы не можем помочь вам это исправить.

Alex Poole 28.05.2019 13:00

@AlexPoole, я так же боялся ... любой доступный вариант?

user10086705 28.05.2019 13:01
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
440
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как отмечено в ответе Лукаша на вопрос, на который вы ссылались, синтаксис 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

По какой-то причине точка с запятой выдает ошибку «Недопустимый символ», но без нее, похоже, пока работает. Собираюсь закончить более сложный запрос, который я подаю, чтобы работать с этим и посмотреть, работает ли он :) Спасибо.

user10086705 28.05.2019 13:19

Точка с запятой — это разделитель операторов, у меня 20 лет мышечной памяти от работы с SQL*Plus, поэтому я добавляю ее автоматически. Но да, в другом клиенте, или с другими настройками, или через JDBC и т. д. - это не часть оператора, поэтому он получит эту ошибку.

Alex Poole 28.05.2019 13:28

Немного продолжения: что, если я хочу получить исходное значение, если это не число? Попытался заменить 0 используемой переменной, но получил «несогласованные типы данных: ожидаемое число получило CHAR», что очевидно. Любая работа для этого (не имеет большого значения, просто аккуратное дополнение), потому что единственный способ, который я могу придумать, - это каким-то образом преобразовать число обратно в char после завершения сравнения.

user10086705 28.05.2019 13:38

Вы либо сравниваете значения как числа, и в этом случае нечисловые значения не могут быть включены; или вы обрабатываете все как строки, что, очевидно, не будет сортировать числовые значения в числовом порядке. Их нельзя смешивать. Как бы вы хочу сравнили «число» и строку (например, T и 5, я полагаю)? Вы, мог, я полагаю, нормализуете числа обратно в строки фиксированной длины, дополненные нулями (если они целые), но это звучит не очень хорошо. Наверное, я не очень понимаю, чего вы пытаетесь достичь.

Alex Poole 28.05.2019 13:48

Другие вопросы по теме