programing

Oracle 번호 및 varchar 조인

telebox 2023. 7. 21. 21:33
반응형

Oracle 번호 및 varchar 조인

두 테이블을 연결하는 쿼리가 있습니다.한 테이블에는 varchar 유형의 열이 있고 다른 테이블에는 숫자 유형이 있습니다.저는 3개의 오라클 데이터베이스에 대한 쿼리를 실행했고, 설명할 수 있기를 바라는 이상한 결과를 보고 있습니다.두 개의 데이터베이스에서 다음과 같은 작업이 수행됩니다.

select a.col1, b.somecol 
from tableA a inner join tableB b on b.col2=a.col1;

이 쿼리 테이블에서 A.col1은 유형 번호이고 테이블 B.col2는 varchar 유형입니다.이것은 두 개의 데이터베이스에서는 잘 작동하지만 세 번째 데이터베이스에서는 잘 작동하지 않습니다.세 번째 오류가 발생합니다(ORA-01722).세 번째는...

select a.col1, b.somecol 
from tableA a inner join tableB b on b.col2=to_char(a.col1);

이것은 모든 데이터베이스에서 작동합니다.제가 궁금한 것은 왜죠?위의 것은 단순화된 쿼리이며, 실제 쿼리는 조금 더 복잡하고 많은 데이터를 검색하므로 첫 번째 버전이 훨씬 빠릅니다.모든 환경에서 작동할 수 있다면 정말 좋을 것입니다.

데이터 유형에 캐스트가 없는 일부 오라클 데이터베이스에서는 이러한 기능이 작동하지 않는 이유를 아는 사람이 있습니까?이러한 동작을 가능하게 하는 글로벌 설정이 있습니까?

암시적 변환이 실패하는 한 가지 이유는 결합 막대 열에 숫자가 아닌 데이터가 포함되어 있기 때문입니다.Oracle은 문자열을 변환하여 varchar2 조인 수를 처리합니다(Gary의 주석 인용 참조). 따라서 실제로 다음을 실행합니다.

select a.col1, b.somecol 
from tableA a inner join tableB b on to_number(b.col2)=a.col1;

테이블 B.col2에 숫자가 아닌 값이 포함된 경우(가능성이 매우 높은 것으로 보임), 결국 문자열입니다. 그러면 Hull이 됩니다.ORA-01722: invalid number숫자 열을 문자열에 명시적으로 캐스팅하여 Oracle의 기본 동작을 단락시킵니다.

처음 두 환경에서 이 문제가 발생하지 않는다는 사실은 구성이 아니라 운에 달려 있습니다.쿼리를 해제하려면 숫자가 아닌 문자열 하나만 필요하므로 언제든지 공격할 수 있습니다.따라서 모든 환경에서 명시적으로 변환하여 실행해야 합니다.

성능에 대해서는 함수 기반 인덱스를 작성할 수 있습니다.

create index whatever_idx on tableA ( to_char(col1) )
/ 

언급URL : https://stackoverflow.com/questions/2330437/oracle-number-and-varchar-join

반응형