#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