postgresql - metin alanındaki bir dizenin tüm örneklerini değiştirir


Yanıtlar:


404

Postgresql'in replace işlevini kullanmak istiyorsunuz :

replace(string text, from text, to text)

Örneğin :

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

Bununla birlikte, bunun bir dizeden dizeye değiştirme olacağına dikkat edin, böylece 'kategori' 'dogegory' haline gelecektir. regexp_replace işlevi, değiştirmek istediğiniz şey için daha katı bir eşleşme düzeni tanımlamanıza yardımcı olabilir.


4
Merhaba arkadaşlar, cevabınızı ve açıklamanızı beğendim, gerçekten yardımcı oluyor. Regexp_replace kullanarak bir örnek ekleyebilir misiniz? Teşekkürler!
Wim Feijen

1
daha iyi ayrıntı regexp_replace
düzeyi

83

Düzenli İfade Yolu

Daha katı değiştirme eşleşmesine ihtiyacınız varsa PostgreSQL'in regexp_replaceişlevi POSIX normal ifade kalıplarını kullanarak eşleşebilir. Regexp_replace sözdizimine sahiptir (kaynak, desen, değiştirme [, bayraklar]) .

Bayrakları ive büyük / gküçük harfe duyarsız ve küresel eşleme için kullanacağım . Ben de kullanacak \mve \Msırasıyla başlangıç ve bir kelimenin sonuna eşleşecek.

Regex replasmanı yaparken genellikle birkaç gotcha vardır. Bunun üzerinde değiştirmek ne kadar kolay görelim kedi bir ile köpek .

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

Tüm bunlardan sonra bile, en az bir çözülmemiş durum var. Örneğin, "Kedi" ile başlayan cümleler, cümle büyük harf kullanımını bozan küçük harfli "köpek" ile değiştirilecektir.

Tüm ayrıntılar için mevcut PostgreSQL kalıp eşleme belgelerine göz atın .

Tüm sütunu yedek metinle güncelle

Örneklerim göz önüne alındığında, belki de en güvenli seçenek:

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

30

replaceİşlevi kullanabilirsiniz

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

İşlev tanımı aşağıdaki gibidir ( buradan alınmıştır ):

replace(string text, from text, to text)

ve değiştirilen metni döndürür. Ayrıca bu sql kemanı kontrol edebilirsiniz .


0

Bir sütundaki 1 veya daha fazla beyaz boşluk karakterinin tüm örneklerini normal ifadeyi kullanarak bir alt çizgi ile değiştiren bir örnek -

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

Bence "s" önce sadece bir ters eğik çizgi
Marty Neal
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.