2010-11-24 2 views
2

, 나는 커플 레코드 (문자열, 숫자) 이렇게 분리가 :부부 구분 기호 *와 요소 구분 기호를 사용하여 Oracle 레코드 내의 필드를 바꿉니다. Oracle 테이블에서

Abc|3456*Def|7890*Ghi|9430*Jkl|3534 

앞의 예에서는, 부부는 다음과 같습니다

(Abc,3456) 
(Def,7890) 
(Ghi,9430) 
(Jkl,3534) 

나는 각 레코드를 수정하고 싶습니다 모든 부부의 순서를 바꾼다. (첫 번째 숫자와 문자열) :

3456|Abc*7890|Def*9430|Ghi*3534|Jkl 

부부의 두 요소의 구분자는 pipe (|)이다. 커플 사이의 구분 기호는 별표 (*)입니다.

모든 커플의 순서를 바꾸려면 어떻게해야합니까?

친절한 협조에 감사드립니다.

답변

4

... 지금 당신은 두 가지 문제가있어 정규식을 사용하여보십시오 : 기본적으로 정규식이 아닌 모두를위한 검색을 말하고있다

select 
    cola, 
    regexp_replace(cola, '([^*|]*)\|([^*|]*)(\*|$)','\2|\1\3') as swapped_col 
from (
    select '3456|Abc*7890|Def*9430|Ghi*3534|Jkl' cola from dual 
) 

을 | 또는 찾을 때까지 a *를 찾은 다음, a |가 아닌 모든 것을 찾으십시오. 또는 * 문자열을 찾을 때까지 *. 그런 다음 두 비트를 바꿔 마지막 분리 기호 (* 또는 EOL)로 찾은 문자로 종료하십시오. 스왑 된 비트는 대괄호로 그룹화 된 다음 대체 문자열에서 숫자가 어디에 배치되는지 나타냅니다 ... 따라서 두 번째 대괄호 세트의 내용이 먼저 놓인 다음 세로 막대, 첫 번째 대괄호 세트 , 세 번째. 기본적으로

, REGEXP_REPLACE이 패턴의 발견하는 모든 발생을 교체하고

+0

가 대단히 감사합니다 그것을 대체 할 것이다, 당신은 정규 표현식으로 중대하다! ;-) – UltraCommit

+0

문자열이 DOT (.)으로 끝나면 regexp_replace는 바뀌지 않습니다. 이 문제를 어떻게 해결할 수 있습니까?! 나는 '를 대체하여 해결 방법을 발견했다.' 'AEIOU'로 변경 한 다음 REGEXP_REPLACE를 사용하고 'AEIOU'를 '.'로 바꾸십시오. 다시. REGEXP_REPLACE로 어떻게 할 수 있습니까? – UltraCommit

+1

대괄호 두 세트에서 점 (.)을 제거하고 별표'[^ * |] * '로 바꾸십시오. 미안, 저기 있으면 안된다. 대괄호 조각은 구분 기호 인'|'또는'*'를 제외한 모든 것을 검색해야한다고 말합니다. 나는 대답을 바꿀 것이다 –