postgresql - thay thế tất cả các phiên bản của chuỗi trong trường văn bản


213

Trong postgresql, làm cách nào để thay thế tất cả các phiên bản của chuỗi trong cột cơ sở dữ liệu?

Nói rằng tôi muốn thay thế tất cả các trường hợp catvới dog, ví dụ.

Cách tốt nhất để làm điều này là gì?


7
Nếu googling không thành công, hãy thử hướng dẫn sử dụng: postgresql.org/docs/civerse/static/fifts-opes.html
a_horse_with_no_name

Câu trả lời:


404

Bạn muốn sử dụng chức năng thay thế của postgresql :

replace(string text, from text, to text)

ví dụ :

UPDATE <table> SET <field> = replace(<field>, 'cat', 'dog')

Tuy nhiên, hãy lưu ý rằng đây sẽ là một sự thay thế theo chuỗi, vì vậy 'thể loại' sẽ trở thành 'giáo điều'. hàm regrec_Vplace có thể giúp bạn xác định mẫu khớp phù hợp hơn cho những gì bạn muốn thay thế.


4
Chào các bạn, tôi thích câu trả lời và giải thích của bạn, nó thực sự hữu ích. Bạn có thể vui lòng thêm một ví dụ bằng cách sử dụng regrec_Vplace không? Cảm ơn!
Wim Feijen

1
để có độ chi tiết tốt hơn, bạn có thể sử dụngregexp_replace
drs

83

Cách diễn đạt thông thường

Nếu bạn cần kết hợp thay thế chặt chẽ hơn, regexp_replacechức năng của PostgreQuery có thể khớp với các mẫu biểu thức chính quy POSIX. Nó có cú pháp regrec_Vplace (nguồn, mẫu, thay thế [, cờ]) .

Tôi sẽ sử dụng cờ igcho trường hợp tương ứng không phân biệt chữ hoa và chữ thường. Tôi cũng sẽ sử dụng \m\Mđể phù hợp với đầu và cuối của một từ, tương ứng.

Thường có khá nhiều vấn đề khi thực hiện thay thế regex. Chúng ta hãy xem việc thay thế một con mèo bằng một con chó dễ dàng như thế nào .

SELECT regexp_replace('Cat bobcat cat cats catfish', 'cat', 'dog');
-->                    Cat bobdog cat cats catfish

SELECT regexp_replace('Cat bobcat cat cats catfish', 'cat', 'dog', 'i');
-->                    dog bobcat cat cats catfish

SELECT regexp_replace('Cat bobcat cat cats catfish', 'cat', 'dog', 'g');
-->                    Cat bobdog dog dogs dogfish

SELECT regexp_replace('Cat bobcat cat cats catfish', 'cat', 'dog', 'gi');
-->                    dog bobdog dog dogs dogfish

SELECT regexp_replace('Cat bobcat cat cats catfish', '\mcat', 'dog', 'gi');
-->                    dog bobcat dog dogs dogfish

SELECT regexp_replace('Cat bobcat cat cats catfish', 'cat\M', 'dog', 'gi');
-->                    dog bobdog dog cats catfish

SELECT regexp_replace('Cat bobcat cat cats catfish', '\mcat\M', 'dog', 'gi');
-->                    dog bobcat dog cats catfish

SELECT regexp_replace('Cat bobcat cat cats catfish', '\mcat(s?)\M', 'dog\1', 'gi');
-->                    dog bobcat dog dogs catfish

Ngay cả sau tất cả những điều đó, có ít nhất một điều kiện chưa được giải quyết. Ví dụ: các câu bắt đầu bằng "Cat" sẽ được thay thế bằng "dog" chữ thường, cách viết hoa.

Kiểm tra các tài liệu phù hợp với mẫu PostgreSQL hiện tại để biết tất cả các chi tiết.

Cập nhật toàn bộ cột bằng văn bản thay thế

Cho ví dụ của tôi, có lẽ lựa chọn an toàn nhất sẽ là:

UPDATE table SET field = regexp_replace(field, '\mcat\M', 'dog', 'gi');

30

Bạn có thể sử dụng replacechức năng

UPDATE your_table SET field = REPLACE(your_field, 'cat','dog')

Định nghĩa hàm như sau (có từ đây ):

replace(string text, from text, to text)

và trả về văn bản sửa đổi. Bạn cũng có thể kiểm tra fiddle sql này .


0

Dưới đây là một ví dụ thay thế tất cả các phiên bản của 1 hoặc nhiều ký tự khoảng trắng trong một cột bằng dấu gạch dưới bằng biểu thức chính quy -

select distinct on (pd)
regexp_replace(rndc.pd, '\\s+', '_','g') as pd
from rndc14_ndc_mstr rndc;

Tôi nghĩ chỉ cần một dấu gạch chéo ngược trước chữ "s"
Marty Neal
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.