SQLite - ganti bagian dari string

104

Apakah mungkin menggunakan SQLdalam SQLitetabel untuk mengganti bagian dari string?

Misalnya, saya memiliki tabel di mana salah satu bidang menyimpan jalur ke file. Apakah mungkin untuk mengganti bagian string sehingga, misalnya

c:\afolder\afilename.bmp

menjadi

c:\anewfolder\afilename.bmp

?

colin
sumber

Jawaban:

207

Anda dapat menggunakan replace()fungsi bawaan untuk melakukan penggantian string dalam kueri.

Fungsi manipulasi string lainnya (dan lebih banyak lagi) dirinci dalam daftar fungsi inti SQLite

Hal berikut akan mengarahkan Anda ke arah yang benar.

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

Andrew
sumber
6
Meskipun klausa WHERE tidak diperlukan, klausa ini memberikan sedikit ketenangan pikiran. Tanpa WHERE, SqlLite akan memberi tahu Anda bahwa setiap baris di tabel Anda terpengaruh. Dengan menggunakan WHERE, Anda hanya akan mendapatkan selusin baris yang Anda harapkan, bukan kemungkinan ribuan.
Pernikahan Weston
2
@WestonWedding Saya telah membandingkan waktu kueri dengan dan tanpa klausa WHERE. Tanpa tempat permintaan mengambil dua kali waktu.
Parag Bafna
FYI, solusi ini dan vladkras peka huruf besar / kecil. Saya bereksperimen dengan memasukkan pernyataan LIKE untuk membuatnya tidak peka huruf besar / kecil, tetapi saya tidak bisa membuatnya berfungsi, saya rasa itu tidak mungkin dengan perintah Ganti SQLite.
ShadowLiberal
Terima kasih. Darktable menggunakan sqlite db untuk menyimpan lokasi gambar, jadi ini menghemat sekitar 9000 perubahan!
Phil
30

Jawaban @ Andrew sebagian benar. Tidak perlu menggunakan WHEREklausa di sini:

  1. Hanya bidang yang berisi yang C:\afolderakan terpengaruh, tidak ada alasan untuk memeriksanya. Itu berlebihan.
  2. 'C:\afolder\%'akan memilih hanya bidang yang dimulai dengan C:\afolder\saja. Bagaimana jika Anda memiliki jalur ini di dalam string?

Jadi kueri yang benar hanyalah:

UPDATE table SET field = replace( field, 'C:\afolder\', 'C:\anewfolder\');
vladkras.dll
sumber
Apakah ini akan menggantikan string di setiap string di kolom "field"?
fifaltra
@fifaltra ya itu akan
resedasue
Perhatikan bahwa saya tidak akan merekomendasikan untuk menggunakan replace () ketika Anda ingin memperbarui jalur sistem file jika mereka relatif (bukan absolut). Lihat stackoverflow.com/questions/50161090/…
NameZero912
10

Dan jika Anda hanya ingin melakukannya dalam kueri tanpa konsekuensi jangka panjang:

SELECT fieldA, replace(field, 'C:\afolder\', 'C:\anewfolder\'), fieldB FROM table;
bugmenot123
sumber