оракул присоединить строку к числу не работает, добавив regexp_like - PullRequest
2 голосов
/ 03 ноября 2019

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 ]

1 голос
/ 03 ноября 2019

Требуется 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 голос
/ 03 ноября 2019

Примерно так:

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

Вот это DEMO

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