postgresql - ganti semua instance string dalam bidang teks

213

Di postgresql, bagaimana cara mengganti semua instance string dalam kolom database?

Katakanlah saya ingin mengganti semua contoh catdengan dog, misalnya.

Apa cara terbaik untuk melakukan ini?

menandai
sumber
7
Jika googling gagal, coba manual: postgresql.org/docs/current/static/functions-string.html
a_horse_with_no_name

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.

Jerome WAGNER
sumber
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');
Clint Pachl
sumber
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 .

Ciprian Mocanu
sumber
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;
pengguna1797212
sumber
Saya kira hanya diperlukan satu backslash sebelum huruf "s"
Marty Neal