ใน postgresql ฉันจะแทนที่อินสแตนซ์ทั้งหมดของสตริงภายในคอลัมน์ฐานข้อมูลได้อย่างไร
สมมติว่าฉันต้องการแทนที่อินสแตนซ์ทั้งหมดcat
ด้วยdog
ตัวอย่างเช่น
วิธีที่ดีที่สุดในการทำเช่นนี้คืออะไร?
ใน postgresql ฉันจะแทนที่อินสแตนซ์ทั้งหมดของสตริงภายในคอลัมน์ฐานข้อมูลได้อย่างไร
สมมติว่าฉันต้องการแทนที่อินสแตนซ์ทั้งหมดcat
ด้วยdog
ตัวอย่างเช่น
วิธีที่ดีที่สุดในการทำเช่นนี้คืออะไร?
คำตอบ:
คุณต้องการใช้ฟังก์ชั่นแทนที่ของ postgresql :
replace(string text, from text, to text)
เช่น:
UPDATE <table> SET <field> = replace(<field>, 'cat', 'dog')
อย่างไรก็ตามโปรดทราบว่านี่จะเป็นการเปลี่ยนแบบสตริงเป็นสตริงดังนั้น 'หมวดหมู่' จะกลายเป็น 'dogegory' ฟังก์ชัน regexp_replace อาจช่วยให้คุณกำหนดรูปแบบการจับคู่ที่เข้มงวดขึ้นสำหรับสิ่งที่คุณต้องการแทนที่
regexp_replace
หากคุณต้องการจับคู่การแทนที่ที่เข้มงวด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');
คุณสามารถใช้replace
ฟังก์ชั่น
UPDATE your_table SET field = REPLACE(your_field, 'cat','dog')
นิยามฟังก์ชั่นมีดังนี้ (ได้จากที่นี่ ):
replace(string text, from text, to text)
และส่งคืนข้อความที่ถูกแก้ไข นอกจากนี้คุณยังสามารถตรวจสอบซอซอฟแวร์ sqlนี้
นี่คือตัวอย่างที่แทนที่ทุกอินสแตนซ์ของ 1 หรือมากกว่าอักขระช่องว่างสีขาวในคอลัมน์ที่มีขีดล่างโดยใช้การแสดงออกปกติ -
select distinct on (pd)
regexp_replace(rndc.pd, '\\s+', '_','g') as pd
from rndc14_ndc_mstr rndc;