programing

Oracle에서 문자열을 숫자로 선택

mailnote 2023. 9. 23. 23:00
반응형

Oracle에서 문자열을 숫자로 선택

이런 이상한 행동을 발견했고 이걸 가지고 머리가 깨지고 있어요생각나는 사람?

Oracle 10g: 두 개의 다른 테이블이 있습니다. 둘 다 "TESTCOL"이라는 열이 Varchar2(10)로 Null이 아닙니다.

1에서 이 쿼리를 수행하면 적절한 결과를 얻을 수 있습니다.

select * from table1 where TESTCOL = 1234;

가 '1234'를 특별히...오타가 아니라 동적으로 생성된 쿼리이므로 변경하지 않도록 노력하겠습니다(적어도 가까운 미래는 아님).

그러나 동일한 쿼리를 실행하면 표 2에서 다음과 같은 오류 메시지가 나타납니다.

ORA-01722: Invalid number

두 쿼리 모두 동일한 세션, 동일한 데이터베이스에서 실행됩니다.

저는 그 열로 이 두 테이블을 결합해왔고, 결합은 잘 되고, 유일한 문제는 제가 그 조건을 사용하려고 할 때마다 나타납니다.

테이블마다 무엇이 다를 수 있는지에 대한 아이디어가 있습니까?

미리 감사드립니다.

한다면TESTCOL숫자가 아닌 경우 변환할 때 Oracle에서 문제가 발생할 수 있습니다.TESTCOL숫자 입력내부적으로 하는 일은 다음과 같습니다.

select * from table1 where TO_NUMBER(TESTCOL) = 1234;

당신이 그렇게 확신한다면.1234로 표현할 수 없습니다.VARCHARliteral, 숫자 값이 아닌 varchar 값을 비교하기 위해 대신 다음을 시도합니다.

select * from table1 where TESTCOL = TO_CHAR(1234);

당연한 표 2.TESTCOL에 숫자가 아닌 값이 포함되어 있습니다.문자열을 숫자 리터럴과 비교하면 암시적 변환이 생성됩니다.따라서 숫자로 캐스트할 수 없는 TESTCOL의 값은 ORA-1722를 허들하게 됩니다.

문자열을 비교하고 있기 때문에 두 표를 비교하는 위치에 맞지 않습니다.

두 가지 선택지가 있습니다. 어느 쪽도 좋아하지 않으실 겁니다.가장 명확한 답은 TABLE2 h에 숫자가 포함되지 않도록 데이터를 정리하는 것입니다.열을 숫자 데이터 형식으로 변경하는 것과 결합하는 것이 이상적입니다.그렇지 않으면 생성기를 변경하여 맹렬한 데이터 모델에 대해 실행할 수 있는 코드를 생성할 수 있습니다.이 경우, 매핑된 열에 문자 데이터 형식이 있는 경우 리터럴을 따옴표로 묶는 것을 의미합니다.

당신은 여기서 암시적인 유형의 캐스팅의 위험에 부딪치고 있습니다.

라는 표현으로testcol = 1234당신은 당신이 치료하고 싶다고 진술합니다.testcol숫자 열로서, Oracle은 해당 열의 모든 값을 숫자로 변환하려고 합니다.

ORA-01722는 해당 열의 하나 이상의 값이 숫자가 아니기 때문에 발생합니다.

당신이 이것이 "오탈자가 아니다"라고 주장할지라도, 그것은 정말로 오타입니다.구문상의 오류입니다.

를(를) 변수를 로 선언해야 .where testcol = '1234'

올바른 조건을 만드는 것이 문제를 해결하는 유일한 방법입니다.

다음이 효과가 있어야 합니다.그냥 "당신의 어디"를 대체하세요.

select * 
from table1 
where (select TO_NUMBER(TESTCOL) 
       from table2 
       where "your where") = 1234;

언급URL : https://stackoverflow.com/questions/9890883/select-string-as-number-on-oracle

반응형