2012-07-30 45 views
26

Tôi có một bảng chứa một số hàng có cột chứa URL. URL có dạng:Cụm từ thông dụng tìm và thay thế trong Postgres

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

Tôi muốn thay thế tất cả các trận đấu trong cột đó với http://example2.com/dotFile.com trong khi giữ lại tất cả mọi thứ sau: 9999. Tôi đã tìm thấy một số tài liệu về regexp_matches và regexp_replace, nhưng tôi không thể hoàn toàn quấn quanh đầu của tôi.

Trả lời

27

nếu bạn biết url, bạn không phải sử dụng regex. replace() chức năng nên làm việc cho bạn:

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

bạn có thể thử:

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

+1 cho cách tiếp cận thực dụng. – Tomalak

+5

Cảm ơn, điều đó đã xảy ra. bảng cập nhật trường SET = thay thế (trường, 'one.example1.com:9999','example2.com') – ringocub

40

Để thay thế một chuỗi cố định, sử dụng replace() chức năng đơn giản.

Để thay thế một chuỗi động, bạn có thể sử dụng regexp_replace() như thế này:

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

'replace()' thực hiện một công việc đơn giản ở đây, như bạn đã tự nhận xét. Tuy nhiên, để thay thế "tất cả các kết quả phù hợp" bằng 'regexp_replace()', bạn phải thêm tham số thứ 4 ''g'' .. cho" toàn cục ". –

+0

@Erwin Cảm ơn bạn đã gợi ý. Tôi đã bao gồm điều đó. – Tomalak

+0

Tôi đã tìm kiếm một trong những tôi có thể sử dụng trong một mệnh đề where như 'UPDATE ... WHERE" email "= regexp_matches (" email ", E '. [Co.tz]')' để lọc và cải thiện tốc độ cập nhật. Nhưng điều này cũng ổn, vì tôi chỉ làm điều này một lần, trong phát triển. Cảm ơn bạn, vì tôi thực sự muốn có một giải pháp 'regexp' tho. :) – ArchNoob

Các vấn đề liên quan