2012-07-30 4 views
26

URL이 포함 된 열이있는 행이 여러 개인 테이블이 있습니다. URL은 형식은 다음과 같습니다Postgres에서 정규식 찾기 및 바꾸기

http://one.example1.com:9999/dotFile.com

난 후 모든 것을 유지하면서 http://example2.com/dotFile.com에 해당 열의 모든 일치를 대체하고 싶습니다 : 9999. 내가 regexp_matches 및 regexp_replace에 대한 몇 가지 문서를 찾았지만, 꽤 주위에 내 머리를 감쌀 수 없습니다.

답변

27

URL을 알고 있으면 정규식을 사용할 필요가 없습니다. 대체() 함수는 당신을 위해 작동합니다 :

replace(string text, from text, to text)   
Replace all occurrences in string of substring from with substring to 
example: replace('abcdefabcdef', 'cd', 'XX') abXXefabXXef 

당신이 시도 할 수 :

replace(yourcolumn, 'one.example1.com:9999','example2.com') 
+1

일을 실용적인 접근 방식. – Tomalak

+5

고마워요, 그 속임수를했습니다. 업데이트 테이블 SET 필드 = replace (필드, 'one.example1.com:9999','example2.com') – ringocub

40

는 고정 문자열을 대체 간단한 replace() 기능을 사용하려면.

는이 같은 regexp_replace()을 사용할 수 있습니다, 동적 문자열을 교체하려면 :

UPDATE 
    YourTable 
SET 
    TheColumn = regexp_replace(
    TheColumn, 'http://[^:\s]+:9999(\S+)', 'http://example2.com\1', 'g' 
) 
+8

'replace() '는 이미 자신이 주석을 달았으므로 여기서 더 간단한 작업을 수행합니다. 그러나, "모든 일치"를'regexp_replace()'로 바꾸려면, 네 번째 매개 변수' 'g'' ..를 "global"에 추가해야합니다. –

+0

@Erwin 힌트를 보내 주셔서 감사합니다. 나는 그것을 포함시켰다. – Tomalak

+0

나는 UPDATE ... WHERE "email"= regexp_matches ("email", E '. [co.tz]')'와 같은 where 절에서 업데이트 속도를 필터링하고 개선하기 위해 사용할 수있는 것을 찾고 있었다. 그러나 이것도 괜찮습니다. 왜냐하면 저는 한 번만 이것을 개발 단계에서하고 있기 때문입니다. 고맙습니다. 왜냐하면 나는 정말로'regexp' 해결책을 원했기 때문입니다. :) – ArchNoob