ORACLE SQL - подстановочный знак в имени строки - PullRequest
0 голосов
/ 23 октября 2019

У меня есть 2 таблицы - Таблица1 и Таблица2.

Table1.ROrd = 00123 и Table2.Ord = 123.

Мне нужно найти все значения, где Table2.Ord содержит часть значения в able1.ROrd.

Так как я получаю неверный номер ошибка, я попробовал это. Но этого недостаточно, потому что значения не совпадают точно.

select * from Table1 where to_char(ROrd) in (select to_char(Ord) from Table2)

Ответы [ 2 ]

0 голосов
/ 23 октября 2019

Используйте EXISTS и LIKE для сравнения двух таблиц:

select *
from   Table1 t1
where  EXISTS (
  SELECT 1
  FROM   table2 t2
  WHERE  t1.ROrd LIKE '%' || t2.Ord || '%'
)

или, если значения просто дополнены нулями, то:

select *
from   Table1 t1
where  EXISTS (
  SELECT 1
  FROM   table2 t2
  WHERE  t1.ROrd = LPAD( t2.Ord, 5, '0' )
)
0 голосов
/ 23 октября 2019

Если вы выполняете перекрестное объединение этих таблиц и вычисляете некоторые сходства или хороший, старый результат instr функции, то вы получите что-то вроде этого (с моими примерами данных, конечно):

SQL> with
  2    tab1 (ord) as
  3      (select '00123' from dual union all
  4       select 'ab445' from dual union all
  5       select 'xyz'   from dual
  6      ),
  7    tab2 (ord) as
  8      (select '123'   from dual union all
  9       select 'ab556' from dual union all
 10       select 'zyx'   from dual
 11      )
 12  select a.ord, b.ord,
 13         utl_match.jaro_winkler_similarity(a.ord, b.ord) jwsim,
 14         utl_match.edit_distance_similarity(a.ord, b.ord) edsim,
 15         --
 16         instr(a.ord, b.ord) ins
 17  from tab1 a cross join tab2 b;

ORD   ORD        JWSIM      EDSIM        INS
----- ----- ---------- ---------- ----------
00123 123            0         60          3
00123 ab556          0          0          0
00123 zyx            0          0          0
ab445 123            0          0          0
ab445 ab556         78         40          0
ab445 zyx            0          0          0
xyz   123            0          0          0
xyz   ab556          0          0          0
xyz   zyx           55         34          0

9 rows selected.

SQL>

Теперь решите, какой вариант подходит вам больше всего.

INSTR достаточно просто:

 <snip>
 17  from tab1 a cross join tab2 b
 18  where instr(a.ord, b.ord) > 0;

ORD   ORD        JWSIM      EDSIM        INS
----- ----- ---------- ---------- ----------
00123 123            0         60          3

SQL>

Выберите уровень сходства самостоятельно, например, 60, но это, вероятно, не то, что вы хотите в этом случае:

 <snip>
 17  from tab1 a cross join tab2 b
 18  where utl_match.jaro_winkler_similarity(a.ord, b.ord) > 60;

ORD   ORD        JWSIM      EDSIM        INS
----- ----- ---------- ---------- ----------
ab445 ab556         78         40          0

SQL>

Я думаю, instr дает лучший результат (согласно тому, что вы описали).

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