SQLite: reemplaza parte de una cadena

104

¿Es posible usar SQLen una SQLitetabla para reemplazar parte de una cadena?

Por ejemplo, tengo una tabla donde uno de los campos contiene la ruta a un archivo. ¿Es posible reemplazar partes de la cuerda para que, por ejemplo,

c:\afolder\afilename.bmp

se convierte en

c:\anewfolder\afilename.bmp

?

colin
fuente

Respuestas:

207

Puede utilizar la replace()función incorporada para realizar un reemplazo de cadena en una consulta.

Otras funciones de manipulación de cadenas (y más) se detallan en la lista de funciones principales de SQLite

Lo siguiente debería apuntarle en la dirección correcta.

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

Andrés
fuente
6
Si bien la cláusula WHERE no es necesaria, brinda un poco de tranquilidad. Sin WHERE, SqlLite le dirá que todas las filas de su tabla se vieron afectadas. Al usar DONDE, solo obtendrá la docena de filas que esperaba en lugar de potencialmente miles.
Boda en Weston
2
@WestonWedding He comparado el tiempo de consulta con y sin la cláusula WHERE. Sin dónde la consulta está tomando el doble de tiempo.
Parag Bafna
FYI, esta y la solución de Vladkras distinguen entre mayúsculas y minúsculas. Experimenté insertando declaraciones LIKE para que no distinga entre mayúsculas y minúsculas, pero no pude hacer que funcionara, no creo que sea posible con el comando SQLite Replace.
ShadowLiberal
Gracias. Darktable usa una base de datos sqlite para almacenar la ubicación de las imágenes, ¡así que esto me ahorró alrededor de 9000 cambios!
Phil
30

La respuesta de @Andrew es parcialmente correcta. No es necesario utilizar la WHEREcláusula aquí:

  1. De C:\afoldertodos modos, solo los campos que contienen se verán afectados, no hay razón para verificarlo. Es excesivo.
  2. 'C:\afolder\%'elegirá solo los campos que comiencen con C:\afolder\solo. ¿Qué pasa si tienes esta ruta dentro de la cadena?

Entonces la consulta correcta es simplemente:

UPDATE table SET field = replace( field, 'C:\afolder\', 'C:\anewfolder\');
vladkras
fuente
¿Reemplazará esto la cadena en cada cadena en la columna "campo"?
Fifaltra
@fifaltra sí lo hará
resedasue
Tenga en cuenta que no recomendaría usar replace () cuando desee actualizar las rutas del sistema de archivos en caso de que sean relativas (en lugar de absolutas). Ver stackoverflow.com/questions/50161090/…
NameZero912
10

Y si solo quieres hacerlo en una consulta sin consecuencias duraderas:

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