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

?

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


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

¿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;
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.