SQLite - Teil eines Strings ersetzen

103

Ist es möglich, SQLin einer SQLiteTabelle einen Teil einer Zeichenfolge zu ersetzen?

Zum Beispiel habe ich eine Tabelle, in der eines der Felder den Pfad zu einer Datei enthält. Ist es möglich, Teile der Saite so zu ersetzen, dass z

c:\afolder\afilename.bmp

wird

c:\anewfolder\afilename.bmp

?

Colin
quelle

Antworten:

206

Sie können das eingebaute verwenden replace() Funktion können Sie eine Zeichenfolgenersetzung in einer Abfrage durchführen.

Weitere Funktionen zur Manipulation von Zeichenfolgen (und mehr) finden Sie in der Liste SQLite-Kernfunktionen aufgeführt

Das Folgende sollte Sie in die richtige Richtung weisen.

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

Andrew
quelle
6
Die WHERE-Klausel ist zwar nicht erforderlich, bietet jedoch ein wenig Sicherheit. Ohne WHERE teilt Ihnen SqlLite mit, dass jede Zeile in Ihrer Tabelle betroffen war. Wenn Sie WHERE verwenden, erhalten Sie nur etwa ein Dutzend Zeilen, die Sie erwartet haben, anstatt möglicherweise Tausende.
Weston Hochzeit
2
@WestonWedding Ich habe die Abfragezeit mit und ohne WHERE-Klausel verglichen. Ohne wo die Abfrage zweimal dauert.
Parag Bafna
Zu Ihrer Information, diese und die Lösung von vladkras unterscheidet zwischen Groß- und Kleinschreibung. Ich habe mit dem Einfügen von LIKE-Anweisungen experimentiert, um die Groß- und Kleinschreibung nicht zu berücksichtigen, aber ich konnte sie nicht zum Laufen bringen. Ich glaube nicht, dass dies mit dem Befehl SQLite Replace möglich ist.
ShadowLiberal
Vielen Dank. Darktable verwendet eine SQLite-Datenbank, um den Speicherort von Bildern zu speichern. Dadurch habe ich ungefähr 9000 Änderungen gespart!
Phil
29

@ Andrew Antwort ist teilweise richtig. Hier muss keine WHEREKlausel verwendet werden:

  1. Nur Felder mit C:\afolder , sind ohnehin betroffen, kein Grund, dies zu überprüfen. Es ist übertrieben.
  2. 'C:\afolder\%'wählt nur Felder aus, die nur mit beginnen C:\afolder\. Was ist, wenn Sie diesen Pfad innerhalb der Zeichenfolge haben?

Die richtige Abfrage lautet also nur:

UPDATE table SET field = replace( field, 'C:\afolder\', 'C:\anewfolder\');
vladkras
quelle
Ersetzt dies die Zeichenfolge in jeder Zeichenfolge in der Spalte "Feld"?
Fifaltra
@fifaltra ja es wird
resedasue
Beachten Sie, dass ich die Verwendung von replace () nicht empfehlen würde, wenn Sie Dateisystempfade aktualisieren möchten, falls diese relativ (statt absolut) sind. Siehe stackoverflow.com/questions/50161090/…
NameZero912
10

Und wenn Sie es nur in einer Abfrage ohne dauerhafte Konsequenzen tun möchten:

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