Oracle присоединяет строку к числу, не работающему, добавляя regexp_like. Например,

Foo                           Bar
--------------                ------------
id varchar2(20)               id number(20,0)

Идентификатор Foo может быть числом или любой строкой (не числом), например, 123, привет, мир, 555 и т. Д.

select foo.id,bar.id from Foo foo 
left join Bar bar on (regexp_like(foo.id, '^[0-9]+$') and foo.id=bar.id)

Ошибка:

ERROR at line 1:
ORA-01722: invalid number

Foo.id = bar.id вычисляется только тогда, когда foo.id является числом, верно?

Следующее работает нормально для MySQL

select foo.id,bar.id from Foo foo 
left join Bar bar on (foo.id=bar.id)

Но это вызывает ORA-01722: неверный номер для оракула. Вот почему "regexp_like" добавляется в состоянии соединения.

2
Sunnyday 3 Ноя 2019 в 01:12

2 ответа

Лучший ответ

Что-то вроде этого:

select foo.id
       , bar.id 
from Foo foo 
left join Bar bar on foo.id = to_char(bar.id);

Вот ДЕМО

1
VBoka 2 Ноя 2019 в 22:49

Требуется Oracle 12.2 или более поздняя версия:

select foo.id,bar.id
from   foo
       left join bar on bar.id = to_number(foo.id default 0 on conversion error);

(Я ожидал, что он будет работать с default null on conversion error, но он завершит сессию.)

Что касается вашего вопроса о том, почему первоначальная попытка с использованием regexp_like не работает, у меня она сработала в 12.2.0.1. Вероятно, в вашем случае он сначала оценивал foo.id = bar.id. Возможно, будет подсказка или переписать запрос, чтобы сначала было применено регулярное выражение.

1
William Robertson 3 Ноя 2019 в 00:01