SQLite - remplace une partie d'une chaîne


104

Est-il possible d'utiliser SQLdans une SQLitetable pour remplacer une partie d'une chaîne?

Par exemple, j'ai une table où l'un des champs contient le chemin d'accès à un fichier. Est-il possible de remplacer des parties de la chaîne de sorte que, par exemple

c:\afolder\afilename.bmp

devient

c:\anewfolder\afilename.bmp

?

Réponses:


207

Vous pouvez utiliser la replace()fonction intégrée pour effectuer un remplacement de chaîne dans une requête.

D'autres fonctions de manipulation de chaînes (et plus) sont détaillées dans la liste des fonctions principales de SQLite

Ce qui suit devrait vous orienter dans la bonne direction.

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


6
Bien que la clause WHERE ne soit pas nécessaire, elle donne un peu de tranquillité d'esprit. Sans WHERE, SqlLite vous dira que chaque ligne de votre table a été affectée. En utilisant le WHERE, vous n'obtiendrez que la douzaine de lignes attendues au lieu de potentiellement des milliers.
Mariage Weston

2
@WestonWedding J'ai comparé le temps de requête avec et sans clause WHERE. Sans où la requête prend deux fois le temps.
Parag Bafna

Pour info, cette solution et celle de vladkras sont sensibles à la casse. J'ai expérimenté l'insertion d'instructions LIKE pour le rendre insensible à la casse, mais je n'ai pas pu le faire fonctionner, je ne pense pas que ce soit possible avec la commande SQLite Replace.
ShadowLiberal

Merci. Darktable utilise une base de données sqlite pour stocker l'emplacement des images, cela m'a donc sauvé environ 9000 changements!
Phil

30

La réponse de @Andrew est partiellement correcte. Pas besoin d'utiliser la WHEREclause ici:

  1. Seuls les champs contenant C:\afolderseront de toute façon affectés, aucune raison de le vérifier. C'est excessif.
  2. 'C:\afolder\%'choisira uniquement les champs commençant par C:\afolder\seulement. Et si vous avez ce chemin dans la chaîne?

La requête correcte est donc simplement:

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

Cela remplacera-t-il la chaîne de chaque chaîne de la colonne "champ"?
fifaltra

@fifaltra yes it will
resedasue le

Notez que je ne recommanderais pas d'utiliser replace () lorsque vous souhaitez mettre à jour les chemins du système de fichiers au cas où ils seraient relatifs (au lieu d'absolus). Voir stackoverflow.com/questions/50161090/…
NameZero912

10

Et si vous voulez simplement le faire dans une requête sans conséquences durables:

SELECT fieldA, replace(field, 'C:\afolder\', 'C:\anewfolder\'), fieldB FROM table;
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.