SQLite: sostituisci parte di una stringa


104

È possibile utilizzare SQLin una SQLitetabella per sostituire parte di una stringa?

Ad esempio, ho una tabella in cui uno dei campi contiene il percorso di un file. È possibile sostituire parti della stringa in modo che, ad es

c:\afolder\afilename.bmp

diventa

c:\anewfolder\afilename.bmp

?

Risposte:


207

È possibile utilizzare la replace()funzione incorporata per eseguire una sostituzione di stringa in una query.

Altre funzioni di manipolazione delle stringhe (e altro) sono descritte in dettaglio nell'elenco delle funzioni principali di SQLite

Quanto segue dovrebbe indicarti la giusta direzione.

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


6
Sebbene la clausola WHERE non sia necessaria, offre un po 'di tranquillità. Senza WHERE, SqlLite ti dirà che ogni riga della tabella è stata interessata. Usando WHERE, otterrai solo la dozzina di righe che ti aspettavi invece che potenzialmente migliaia.
Matrimonio Weston

2
@WestonWedding Ho confrontato il tempo di query con e senza la clausola WHERE. Senza dove la query impiega il doppio del tempo.
Parag Bafna

Cordiali saluti, questa e la soluzione di vladkras distingue tra maiuscole e minuscole. Ho sperimentato l'inserimento di istruzioni LIKE per renderlo insensibile al maiuscolo / minuscolo, ma non sono riuscito a farlo funzionare, non penso sia possibile con il comando SQLite Replace.
ShadowLiberal

Grazie. Darktable utilizza un db sqlite per memorizzare la posizione delle immagini, quindi questo mi ha salvato circa 9000 modifiche!
Phil

30

@Andrew la risposta è parzialmente corretta. Non è necessario utilizzare la WHEREclausola qui:

  1. Solo i campi che contengono C:\afoldersaranno comunque interessati, nessun motivo per controllarlo. È eccessivo.
  2. 'C:\afolder\%'sceglierà solo i campi che iniziano con C:\afolder\solo. E se hai questo percorso all'interno della stringa?

Quindi la query corretta è solo:

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

Questo sostituirà la stringa in ogni stringa nella colonna "campo"?
fifaltra

@fifaltra yes it will
resedasue

Si noti che non consiglierei di utilizzare replace () quando si desidera aggiornare i percorsi del file system nel caso in cui siano relativi (anziché assoluti). Vedere stackoverflow.com/questions/50161090/...
NameZero912

10

E se vuoi solo farlo in una query senza conseguenze durature:

SELECT fieldA, replace(field, 'C:\afolder\', 'C:\anewfolder\'), fieldB FROM table;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.