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

?

Colin
la source

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\%';

Andrew
la source
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\');
Vladkras
la source
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;
bugmenot123
la source