postgresql - ganti semua instance string dalam bidang teks


Jawaban:


404

Anda ingin menggunakan fungsi ganti postgresql :

replace(string text, from text, to text)

misalnya :

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

Namun, perlu diketahui bahwa ini akan menjadi pengganti string-ke-string, sehingga 'kategori' akan menjadi 'dogegori'. fungsi regexp_replace dapat membantu Anda menentukan pola kecocokan yang lebih ketat untuk apa yang ingin Anda ganti.


4
Hai teman-teman, saya suka jawaban dan penjelasan Anda, ini sangat membantu. Bisakah Anda menambahkan contoh menggunakan regexp_replace? Terima kasih!
Wim Feijen

1
untuk granularitas yang lebih baik, Anda dapat menggunakanregexp_replace
drs

83

Cara Ekspresi Reguler

Jika Anda membutuhkan pencocokan pengganti yang lebih ketat, regexp_replacefungsi PostgreSQL dapat dicocokkan dengan menggunakan pola ekspresi reguler POSIX. Itu memiliki sintaks regexp_replace (sumber, pola, penggantian [, bendera]) .

Saya akan menggunakan flag idan guntuk pencocokan case-sensitive dan global, masing-masing. Saya juga akan menggunakan \mdan \Muntuk mencocokkan awal dan akhir kata, masing-masing.

Biasanya ada beberapa gotcha ketika melakukan penggantian regex. Mari kita lihat betapa mudahnya mengganti kucing dengan anjing .

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

Bahkan setelah semua itu, setidaknya ada satu kondisi yang tidak terselesaikan. Misalnya, kalimat yang dimulai dengan "Kucing" akan diganti dengan "anjing" kecil yang mematahkan kapitalisasi kalimat.

Lihat dokumen pencocokan pola PostgreSQL saat ini untuk semua detail.

Perbarui seluruh kolom dengan teks pengganti

Dengan contoh saya, mungkin opsi teraman adalah:

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

30

Anda dapat menggunakan replacefungsi ini

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

Definisi fungsi adalah sebagai berikut (didapat dari sini ):

replace(string text, from text, to text)

dan mengembalikan teks yang dimodifikasi. Anda juga dapat memeriksa biola sql ini .


0

Berikut adalah contoh yang menggantikan semua instance dari 1 atau lebih karakter spasi putih dalam kolom dengan garis bawah menggunakan ekspresi reguler -

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

Saya kira hanya diperlukan satu backslash sebelum huruf "s"
Marty Neal
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.