2013-05-14 1 views
2

이전에 initcap()으로 처리 한 문자열이 있는데, 그 부분을 대문자로 변환합니다.regexp_replace의 psql 대문자 역 참조 문자열

구체적으로 - 나는 로마 숫자를 대문자로 표시하려고합니다. 나는 내가 할 수있는 가정

야나 III Sobieskiego

야나 리이 Sobieskiego를 교체하고 싶습니다

더욱 구체적으로 일종의 상위 substring-subquery comb을 사용한다. 오 그것을 달성하기 위해,하지만 난 그것과 같이, 하나의 REGEXP_REPLACE에서 작동하도록 노력하고 있어요 :

어떻게됩니까
SELECT 
    ulica 
    --, regexp_matches(ulica , '((^|\s)([XxIiVv]+)(\s|$))', 'g') 
    , regexp_replace(ulica, '((^|\s)([XxIiVv]+)(\s|$))', '\2'||upper('q\3q')||'\4' , 'g') 
FROM (
    SELECT unnest(ARRAY['Jana Iii Sobieskiego', 'Xx Lecia', 'Xxx Lecia Panowania Zygmunta Iii Wazy'])::text AS ulica 
) AS src 

이라고 대체 문자열의 '정적'부분에 위의 작품 (Q ... Q), 역 참조는 아닙니다.

내가

야나 QIiiQ Sobieskiego

누구든지 방법이 작업을 수행하는 생각을 가지고 얻을?

는 PostgreSQL의 9.1

+0

어떻게 해결 했습니까? 이 순간에 나는 임시 해결책을 취할 것입니다. 미안 해요 @ Stephan 제 대답을 확인하지 않았기 때문에 제 시스템에서 소문자를 받아들이 기가 쉬웠습니다 –

+1

나는하지 않았습니다. 그것은 할 수없는 것 같습니다. – murison

+0

댓글을 주셔서 감사합니다! 그것은 사후에 좋다. Postgres의 최신 버전에서 이것이 바뀌 었는지 궁금합니다. 건배 –

답변

0

짧은 대답은
불행하게도, 당신이 시도하는 것은 regexp_replace 불가능합니다.

LONG 답변
소개
이 줄

regexp_replace(ulica, '((^|\s)([XxIiVv]+)(\s|$))', '\2'||upper('q\3q')||'\4' , 'g') 

는, regexp_replace하지 않습니다 대문자 어떤 역 참조를 볼 수 있듯이

regexp_replace(ulica, '((^|\s)([XxIiVv]+)(\s|$))', '\2Q\3Q\4' , 'g') 

에 해당합니다.

해결 과정
당신은 매개 변수로 ulica을 가지고 대문자 기본 로마 숫자로 ulica 반환하는 함수를 직접 만들 수 있습니다.

  • 이 기능을 표시 할 첫 번째 단계에서 1 단계
    (나는 마커로 $$을 선택하지만 당신은 하나를 사용할 수 있습니다.) ulica의 부분과 같이 대문자한다 : 제 2 단계에서
 
    regexp_replace(ulica, '((^|\s)([XxIiVv]+)(\s|$))', '\2$$\3$$\4' , 'g') 
  • 2 단계
    , 결과 스트링을 통해 이동하여 두 마커 사이에 각각의 문자를 대문자.