SQLite - แทนที่ส่วนหนึ่งของสตริง


104

เป็นไปได้หรือไม่ที่จะใช้SQLในSQLiteตารางเพื่อแทนที่ส่วนหนึ่งของสตริง

ตัวอย่างเช่นฉันมีตารางที่หนึ่งในเขตข้อมูลมีเส้นทางไปยังไฟล์ เป็นไปได้ไหมที่จะเปลี่ยนชิ้นส่วนของสตริงเพื่อให้เช่น

c:\afolder\afilename.bmp

กลายเป็น

c:\anewfolder\afilename.bmp

เหรอ?

คำตอบ:


207

คุณสามารถใช้replace()ฟังก์ชันในตัวเพื่อทำการแทนที่สตริงในแบบสอบถาม

ฟังก์ชันการจัดการสตริงอื่น ๆ (และอื่น ๆ ) มีรายละเอียดอยู่ในรายการฟังก์ชันหลักของ SQLite

สิ่งต่อไปนี้ควรชี้ให้คุณไปในทิศทางที่ถูกต้อง

UPDATE table SET field = replace( field, 'C:\afolder\', 'C:\anewfolder\' ) WHERE field LIKE 'C:\afolder\%';


6
แม้ว่าคำสั่ง WHERE จะไม่จำเป็น แต่ก็ให้ความอุ่นใจเล็กน้อย หากไม่มีที่ไหน SqlLite จะบอกคุณว่าทุกแถวในตารางของคุณได้รับผลกระทบ ด้วยการใช้ WHERE คุณจะได้รับแถวที่คุณคาดไว้เท่านั้นแทนที่จะเป็นหลายพันแถว
Weston Wedding

2
@WestonWedding ฉันได้เปรียบเทียบเวลาแบบสอบถามกับและไม่มีคำสั่ง WHERE โดยไม่ต้องใช้เวลาในการสืบค้นสองครั้ง
Parag Bafna

FYI วิธีแก้ปัญหานี้และ vladkras เป็นกรณี ๆ ไป ฉันทดลองใส่คำสั่ง LIKE เพื่อให้ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่ แต่ไม่สามารถใช้งานได้ฉันไม่คิดว่าจะเป็นไปได้ด้วยคำสั่ง SQLite Replace
ShadowLiberal

ขอบคุณ. Darktable ใช้ฐานข้อมูล sqlite เพื่อจัดเก็บตำแหน่งของภาพดังนั้นสิ่งนี้ช่วยให้ฉันประหยัดการเปลี่ยนแปลงได้ถึง 9000 ครั้ง
ฟิลิป

30

คำตอบของแอนดรูว์ถูกต้องบางส่วน ไม่จำเป็นต้องใช้WHEREประโยคที่นี่:

  1. เฉพาะช่องที่มีเท่านั้นที่C:\afolderจะได้รับผลกระทบไม่มีเหตุผลในการตรวจสอบ มันมากเกินไป
  2. 'C:\afolder\%'จะเลือกเฉพาะฟิลด์ที่ขึ้นต้นด้วยC:\afolder\เท่านั้น จะเกิดอะไรขึ้นถ้าคุณมีเส้นทางนี้ในสตริง?

ดังนั้นแบบสอบถามที่ถูกต้องเป็นเพียง:

UPDATE table SET field = replace( field, 'C:\afolder\', 'C:\anewfolder\');

สิ่งนี้จะแทนที่สตริงในทุกสตริงในคอลัมน์ "ฟิลด์" หรือไม่
fifaltra

@fifaltra ใช่มันจะ
resedasue

โปรดทราบว่าฉันไม่แนะนำให้ใช้การแทนที่ () เมื่อคุณต้องการอัปเดตเส้นทางระบบไฟล์ในกรณีที่เป็นแบบสัมพัทธ์ (แทนที่จะเป็นค่าสัมบูรณ์) ดูstackoverflow.com/questions/50161090/…
NameZero912

10

และถ้าคุณแค่ต้องการทำในแบบสอบถามโดยไม่มีผลที่ตามมา:

SELECT fieldA, replace(field, 'C:\afolder\', 'C:\anewfolder\'), fieldB FROM table;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.