Postgresql'de, bir veritabanı sütunundaki bir dizenin tüm örneklerini nasıl değiştiririm?
Diyelim ki tüm örneklerini cat
bununla değiştirmek istiyorum dog
.
Bunu yapmanın en iyi yolu nedir?
Postgresql'de, bir veritabanı sütunundaki bir dizenin tüm örneklerini nasıl değiştiririm?
Diyelim ki tüm örneklerini cat
bununla değiştirmek istiyorum dog
.
Bunu yapmanın en iyi yolu nedir?
Yanıtlar:
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.
regexp_replace
Daha katı değiştirme eşleşmesine ihtiyacınız varsa PostgreSQL'in regexp_replace
işlevi POSIX normal ifade kalıplarını kullanarak eşleşebilir. Regexp_replace sözdizimine sahiptir (kaynak, desen, değiştirme [, bayraklar]) .
Bayrakları i
ve büyük / g
küçük harfe duyarsız ve küresel eşleme için kullanacağım . Ben de kullanacak \m
ve \M
sı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 .
Ö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');
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 .
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;