postgresql - แทนที่อินสแตนซ์ทั้งหมดของสตริงภายในฟิลด์ข้อความ


213

ใน postgresql ฉันจะแทนที่อินสแตนซ์ทั้งหมดของสตริงภายในคอลัมน์ฐานข้อมูลได้อย่างไร

สมมติว่าฉันต้องการแทนที่อินสแตนซ์ทั้งหมดcatด้วยdogตัวอย่างเช่น

วิธีที่ดีที่สุดในการทำเช่นนี้คืออะไร?


7
หาก googling ล้มเหลวให้ลองใช้คู่มือ: postgresql.org/docs/current/static/functions-string.html
a_horse_with_no_name

คำตอบ:


404

คุณต้องการใช้ฟังก์ชั่นแทนที่ของ postgresql :

replace(string text, from text, to text)

เช่น:

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

อย่างไรก็ตามโปรดทราบว่านี่จะเป็นการเปลี่ยนแบบสตริงเป็นสตริงดังนั้น 'หมวดหมู่' จะกลายเป็น 'dogegory' ฟังก์ชัน regexp_replace อาจช่วยให้คุณกำหนดรูปแบบการจับคู่ที่เข้มงวดขึ้นสำหรับสิ่งที่คุณต้องการแทนที่


4
สวัสดีพวกฉันชอบคำตอบและคำอธิบายของคุณมันมีประโยชน์จริงๆ คุณช่วยเพิ่มตัวอย่างโดยใช้ regexp_replace ได้ไหม? ขอบคุณ!
Wim Feijen

1
เพื่อความละเอียดที่ดีขึ้นคุณสามารถใช้งานได้regexp_replace
drs

83

วิธีการแสดงออกปกติ

หากคุณต้องการจับคู่การแทนที่ที่เข้มงวดregexp_replaceฟังก์ชันของ PostgreSQL สามารถจับคู่โดยใช้รูปแบบการแสดงออกปกติของ POSIX มันมีไวยากรณ์regexp_replace (ที่มารูปแบบการเปลี่ยน [ธง])

ฉันจะใช้แฟล็กiและgการจับคู่แบบตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ตามลำดับ ฉันจะใช้\mและ\Mเพื่อให้ตรงกับจุดเริ่มต้นและจุดสิ้นสุดของคำตามลำดับ

โดยทั่วไปจะมีสักสองสาม gotchas เมื่อดำเนินการ replacment regex ลองมาดูวิธีที่ง่ายก็คือการเปลี่ยนแมวกับสุนัข

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

แม้หลังจากทั้งหมดนั้นมีเงื่อนไขอย่างน้อยหนึ่งเงื่อนไขที่ยังไม่ได้แก้ไข ตัวอย่างเช่นประโยคที่ขึ้นต้นด้วย "Cat" จะถูกแทนที่ด้วย "dog" ตัวพิมพ์เล็กซึ่งแบ่งเป็นตัวพิมพ์ใหญ่

ตรวจสอบเอกสารการจับคู่รูปแบบ PostgreSQL ปัจจุบันสำหรับรายละเอียดทั้งหมด

อัปเดตคอลัมน์ทั้งหมดด้วยข้อความแทนที่

จากตัวอย่างของฉันบางทีตัวเลือกที่ปลอดภัยที่สุดน่าจะเป็น:

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

30

คุณสามารถใช้replaceฟังก์ชั่น

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

นิยามฟังก์ชั่นมีดังนี้ (ได้จากที่นี่ ):

replace(string text, from text, to text)

และส่งคืนข้อความที่ถูกแก้ไข นอกจากนี้คุณยังสามารถตรวจสอบซอซอฟแวร์ sqlนี้


0

นี่คือตัวอย่างที่แทนที่ทุกอินสแตนซ์ของ 1 หรือมากกว่าอักขระช่องว่างสีขาวในคอลัมน์ที่มีขีดล่างโดยใช้การแสดงออกปกติ -

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

แบ็กสแลชเดียวก่อนที่จะต้องการ "s" ฉันคิดว่า
Marty Neal
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.