SQLite - bir dizenin parçasını değiştir


104

Bir dizinin bir bölümünü değiştirmek için SQLbir SQLitetabloda kullanmak mümkün mü ?

Örneğin, alanlardan birinin bir dosyanın yolunu tuttuğu bir tablom var. İpin parçalarını değiştirmek mümkün mü, örneğin

c:\afolder\afilename.bmp

olur

c:\anewfolder\afilename.bmp

?

Yanıtlar:


207

replace()Bir sorguda dize değiştirme işlemi gerçekleştirmek için yerleşik işlevi kullanabilirsiniz.

Diğer dize işleme işlevleri (ve daha fazlası) SQLite çekirdek işlevler listesinde ayrıntılı olarak açıklanmıştır.

Aşağıdakiler sizi doğru yöne yönlendirmelidir.

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


6
WHERE cümlesi gerekli olmasa da, biraz gönül rahatlığı sağlar. WHERE olmadan, SqlLite size tablonuzdaki her satırın etkilendiğini söyleyecektir. WHERE özelliğini kullanarak, potansiyel olarak binlerce satır yerine yalnızca beklediğiniz düzinelerce satırı alırsınız.
Weston Düğünü

2
@WestonWedding Sorgu zamanını WHERE yan tümcesi ile ve olmadan karşılaştırdım. Sorgu iki kez zaman alıyor.
Parag Bafna

Bilginize, bu ve vladkras'ın çözümü büyük / küçük harfe duyarlıdır. Büyük / küçük harfe duyarlı hale getirmek için LIKE ifadeleri eklemeyi denedim, ancak çalışmasını sağlayamadım, SQLite Replace komutuyla bunun mümkün olduğunu düşünmüyorum.
ShadowLiberal

Teşekkürler. Darktable, görüntülerin konumunu saklamak için bir sqlite db kullanıyor, bu yüzden bu bana yaklaşık 9000 değişiklik tasarrufu sağladı!
Phil

30

@Andrew cevabı kısmen doğrudur. WHEREBurada madde kullanmaya gerek yok :

  1. C:\afolderZaten sadece içeren alanlar etkilenecek, kontrol etmek için bir neden yok. Aşırı.
  2. 'C:\afolder\%'sadece ile başlayan alanları seçecektir C:\afolder\. Ya bu yol dizginin içinde varsa?

Yani doğru sorgu şudur:

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

Bu, "alan" sütunundaki her dizedeki dizenin yerini alacak mı?
fifaltra

@fifaltra yes it will
2016

Göreli olmaları durumunda (mutlak yerine) dosya sistemi yollarını güncellemek istediğinizde replace () kullanmanızı önermediğimi unutmayın. Bkz stackoverflow.com/questions/50161090/...
NameZero912

10

Ve bunu kalıcı sonuçlar olmadan bir sorguda yapmak istiyorsanız:

SELECT fieldA, replace(field, 'C:\afolder\', 'C:\anewfolder\'), fieldB FROM table;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.