2009-08-05 3 views
0

에 영숫자 문자열의 일부를 읽고 내가 한 열이있는 테이블이 "otname" table1.otname는 다음과 같은 데이터 샘플을 닮은 영숫자 문자열의 여러 행이 포함되어 있습니다. .U.A.F.3.2.21.249.1는 SQL

2001.1.1003. .A.LE.P.P

2010.1.1003. 8261 .A.LE.B.B

내가 다른 테이블에 저장 설명을 읽는 모든 문자열의 네 번째 번호 (굵게 문자열의 일부를) 읽고 오라클 10g 에서 쿼리를 작성하려는

. 내 딜레마는 쿼리의 첫 번째 부분을 작성합니다.

select description_text from table2 where sncode = 8281 -- fourth part of the data sample in every string 

많은 감사 : 테이블에있는 모든 문자열의 네 번째 수를 선택하는 것은

내 두 번째 쿼리는 다음과 같이 될 것입니다. 9i에와

초보자

답변

0

작품 + :

WITH portion AS (
    SELECT SUBSTR(t.otname, INSTR(t.otname, ".", 1, 3)+1, INSTR(t.otname, ".", 1, 4)) 'sncode' 
    FROM TABLE t) 
SELECT t.description_text 
    FROM TABLE2 t 
    JOIN portion p ON p.sncode = t.sncode 

SUBSTR의 사용은 명백해야한다; INSTR은 문자열의 첫 번째 문자 (매개 변수 값 1)에서 시작하여 문자열의 세 번째 및 네 번째 모양에서 마침표 (.)의 위치를 ​​찾는 데 사용됩니다. 당신은 위치가 기간이 4 예를 들어 반환에서 하나를 빼기해야 할 수도 있습니다 - 당신이 바로 그 값을 받고있어 확인하기 위해 첫 번째 테스트 : 당신이 가입하기 전에 문자열이 발생, 그래서 내가 서브 쿼리 인수를 사용

SELECT SUBSTR(t.otname, INSTR(t.otname, ".", 1, 3)+1, INSTR(t.otname, ".", 1, 4)) 'sncode' 
FROM TABLE t 

두 번째 테이블에. 하위 쿼리로 수행 할 수 있지만 하위 쿼리 인수 분해가 빠릅니다.

+0

쿼리 : ORA : 00923 : FROM 키워드를 찾을 수 없습니다. ( – novice

+0

테스트 할 Oracle 인스턴스가 없지만 첫 번째 INSTR에서 "+1"이 유일한 경쟁 지점입니다. 당신은 실행할 시도에서 FROM과 테이블 이름 사이의 공백은? –

0

오라클 (10g 포함)의 최신 버전에는 다양한 정규 표현식 기능이 있습니다. 그래서 당신은 같은 것을 할 수 있습니다

where sncode = to_number(regexp_replace(otname, '^(\d+\.\d+\.\d+\.(\d+))?.+$', '\2')) 

이 문자열의 나머지 다음에 숫자 - 다음 -에 의해-A-점, 그리고 숫자의 제 4 그룹화 세트 3 개 세트를, 일치하는 문자열을 반환 모든 것이 완전히 첫 번째 그룹 (네 번째 숫자 세트)으로 대체되었습니다. (내가 제대로 두 테이블의 당신의 설명을 이해하는 경우)

여기에 완전한 쿼리는 다음과 같습니다

select t2.description_text 
from table1 t1, table2 t2 
where t2.sncode = to_number(regexp_replace(t1.otname, '^(\d+\.\d+\.\d+\.(\d+))?.+$', '\2')) 

또 다른 약간 짧은 다른 정규식 : 나는 위 실행하면 다음과 같은 에러가 발생

where t2.sncode = to_number(regexp_replace(t1.otname, '^((\d+\.){3}(\d+))?.+$', '\3')) 
+0

쿼리를 실행 한 결과 다음과 같은 오류가 나타납니다. ORA-01722 : 잘못된 번호 제안 사항? – novice

+0

나는 당신의 "sncode"도 문자열이라고 생각했다. 실제로 그것이 숫자인지 알려주세요. 그 동안, 나는 그것을 반영하기 위해 나의 대답을 업데이트하고 있으므로 그것을 시도 할 수있다 ("to_number"func). – epost

+0

감사합니다. Sncode는 실제로 숫자입니다. otname은 영숫자입니다. – novice