как объединить две таблицы с разными типами данных столбцов

#sql #oracle

#sql #Oracle

Вопрос:

Я использую toad для oracle, у меня есть две таблицы, в старой таблице CUSTOMER есть столбцы,
а первичный ключ — ** custnum ** ,
его тип данных — «число».
Я создал новую ТРАНЗАКЦИЮ таблицы, и в ней есть столбец с именем ** custnum **, но его тип данных — «varchar2» .

значения полей custnum в таблице customer:

 14953252
14442752
19321147
74893221
  

значения полей custnum в таблице транзакций:

 14953252
AR7475552
19321147
JK8932214
P887655532
WX7893534
  

В моем запросе ошибка

 select t.custnum,t.trascnum,c.custname,c.custaddress
from  transaction t, customer c
where 
t.custnum=c.custnum( )
  

как объединить две таблицы с разными типами данных столбцов??

Комментарии:

1. какую ошибку вы получаете?

2. я получил эту ошибку ORA-01722: недопустимый номер

Ответ №1:

Вы можете использовать LIKE . И LEFT JOIN :

 select t.custnum, t.trascnum, c.custname, c.custaddress
from customer c left join
     transaction t 
     on t.custnum like '%' || c.custnum;
  

Ответ №2:

используйте CAST функцию для изменения типа данных одной переменной на другой.

вы хотели бы сделать что-то вроде этого:

 where transcation.custnum = CAST(customer.custnum as varchar2) ( )
  

Ответ №3:

Для меня это выглядит так, как будто вы ищете полное внешнее соединение:

 SQL> with
  2  -- sample data; you have that amp; don't have to type it
  3  customer (custnum, custname) as
  4    (select 14953252, 'Scott' from dual union all
  5     select 14442752, 'Mike'  from dual union all
  6     select 19321147, 'King'  from dual
  7    ),
  8  transaction (custnum, trascnum) as
  9    (select '14953252' , 25 from dual union all
 10     select 'AR7475552', 13 from dual union all
 11     select '19321147' , 82 from dual
 12    )
 13  -- query you might be interested in
 14  select c.custnum,
 15         c.custname,
 16         t.custnum,
 17         t.trascnum
 18  from customer c full outer join transaction t
 19    on c.custnum = to_number(regexp_substr(t.custnum, 'd $'));

   CUSTNUM CUSTN CUSTNUM     TRASCNUM
---------- ----- --------- ----------
  14953252 Scott 14953252          25
                 AR7475552         13
  19321147 King  19321147          82
  14442752 Mike

SQL>
  

Ответ №4:

Для того, чтобы база данных могла сравнить два значения, их необходимо либо customer.cnum преобразовать в строку, либо transaction.custnum преобразовать в число. Вероятно, ошибка, которую вы получили, была

ORA-01722: недопустимое число

поскольку база данных пыталась рассматривать AR7475552 как число.

Преобразование числа в строку проще:

 select c.custnum
     , c.custname
     , t.custnum
     , t.trascnum
from   transaction t
       left join customer c
            on to_char(c.custnum) = t.custnum;
  

но есть способы обработки строки как числа, например, это (требуется Oracle 12.2 или более поздней версии):

 select c.custnum
     , c.custname
     , t.custnum
     , t.trascnum
from   transaction t
       left join customer c
            on c.custnum = to_number(t.custnum default 0 on conversion error);
  

(Я обнаружил, что использование default null on conversion error in a join завершает сеанс, даже если он действителен в запросе. Если возможно c.custnum , чтобы содержать 0 , вы могли бы использовать более неясное значение, например -1e-9 .)

Ответ №5:

Этот код работает для меня:

 select  t.custnum,c.salary
from transactions t left outer join customer c on t.custnum=to_char(c.custnum);
  

@Littlefoot
@Mureinik