Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Cómo reemplazar más de 2 palabras en el mismo registro?

Estas en el tema de Cómo reemplazar más de 2 palabras en el mismo registro? en el foro de SQL Server en Foros del Web. Hola! estoy intentando reemplazar 2 palabras que se extraen de una segunda tabla, todo con el comando REPLACE, pero solo logro reemplazar una palabra del ...
  #1 (permalink)  
Antiguo 27/05/2014, 11:03
 
Fecha de Ingreso: mayo-2014
Mensajes: 9
Antigüedad: 9 años, 10 meses
Puntos: 0
Cómo reemplazar más de 2 palabras en el mismo registro?

Hola! estoy intentando reemplazar 2 palabras que se extraen de una segunda tabla, todo con el comando REPLACE, pero solo logro reemplazar una palabra del registro, por ejemplo, tengo el registro "BALMACEDA 2355 LOC 102 B OF 25" y quiero reemplazar las palabras "LOC" y "OF" por "LOCAL" y "OFICINA", pero solo logro reemplazar la primera palabra, en este caso LOC por LOCAL.

Acá hay datos de prueba y la query que estoy usando:

Datos de prueba:
Código SQL:
Ver original
  1. CREATE TABLE #datos
  2.     (id INT PRIMARY KEY NOT NULL,
  3.      direccion VARCHAR(250))
  4. GO
  5. INSERT INTO #datos VALUES (1,'MANUEL MONTT 1200 DPTO 3')
  6. INSERT INTO #datos VALUES (2,'BALMACEDA 2355 LOC 102 B OF 25')
  7. INSERT INTO #datos VALUES (3,'B OHGGINS 980 LOC')
  8. INSERT INTO #datos VALUES (4,'LIB BDO OHIGGINS 3410 OF 48 LOC E')
  9. INSERT INTO #datos VALUES (5,'V KENNEDY 9001 LOC 4')
  10. INSERT INTO #datos VALUES (6,'VALLE AZAPA KM 36 PARC 5')
  11. GO
  12. CREATE TABLE #correcto
  13.    (id INT PRIMARY KEY NOT NULL,
  14.     nombre VARCHAR(250) NULL)
  15. GO
  16. INSERT INTO #correcto VALUES (1,'DEPARTAMENTO')
  17. INSERT INTO #correcto VALUES (2,'LOCAL')
  18. INSERT INTO #correcto VALUES (3,'OFICINA')
  19. INSERT INTO #correcto VALUES (4,'KILOMETRO')
  20. INSERT INTO #correcto VALUES (5,'PARCELA')
  21. GO
  22. CREATE TABLE #incorrecto
  23.    (id INT PRIMARY KEY NOT NULL,
  24.     nombre VARCHAR(250) NULL,
  25.     id_correcto INT FOREIGN KEY REFERENCES #correcto(id) NOT NULL)
  26.  
  27. GO
  28. INSERT INTO #incorrecto VALUES (1,'DPTO',1)
  29. INSERT INTO #incorrecto VALUES (2,'LOC',2)
  30. INSERT INTO #incorrecto VALUES (3,'OF',3)
  31. INSERT INTO #incorrecto VALUES (4,'KM',4)
  32. INSERT INTO #incorrecto VALUES (5,'PARC',5)

Y esta es la consulta que estoy utilizando para reemplazar las palabras:
Código SQL:
Ver original
  1. SELECT REPLACE (#datos.direccion, #incorrecto.nombre, #correcto.nombre)
  2. FROM  #correcto
  3.     INNER JOIN #incorrecto ON #correcto.id = #incorrecto.id_correcto
  4.     CROSS JOIN #datos  
  5.     WHERE direccion LIKE '% ' + #incorrecto.nombre + '%'

Como pueden ver, extraigo las palabras que quiero reemplazar de una tabla "incorrecto" y obtengo la palabra bien escrita de "correcto", para luego realizar el replace, pero solo logro reemplazar una palabra por registro.

Cómo puedo hacerlo para reemplazar más de una palabra por registro?

Muchas gracias!
  #2 (permalink)  
Antiguo 27/05/2014, 11:13
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Cómo reemplazar más de 2 palabras en el mismo registro?

¿Por qué no utilizas el servicio de data cleaning?

http://msdn.microsoft.com/en-us/magazine/cc163731.aspx
__________________
MCTS Isaias Islas
  #3 (permalink)  
Antiguo 27/05/2014, 12:59
 
Fecha de Ingreso: mayo-2014
Mensajes: 9
Antigüedad: 9 años, 10 meses
Puntos: 0
Respuesta: Cómo reemplazar más de 2 palabras en el mismo registro?

Cita:
Iniciado por iislas Ver Mensaje
¿Por qué no utilizas el servicio de data cleaning?

[url]http://msdn.microsoft.com/en-us/magazine/cc163731.aspx[/url]
Muchas gracias por responder. Leí la información y me pareció increíble, no conocía esto.
Entendí que se usa a través de SSIS. He utilizado un poco de DTSx pero no encuentro la forma o las opciones para utilizar data cleaning. Me podrías orientar un poco por favor?
Y muchas muchas gracias!
  #4 (permalink)  
Antiguo 27/05/2014, 14:12
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Cómo reemplazar más de 2 palabras en el mismo registro?

Que versión y edición estas manejando
__________________
MCTS Isaias Islas
  #5 (permalink)  
Antiguo 27/05/2014, 14:47
 
Fecha de Ingreso: mayo-2014
Mensajes: 9
Antigüedad: 9 años, 10 meses
Puntos: 0
Respuesta: Cómo reemplazar más de 2 palabras en el mismo registro?

Cita:
Iniciado por iislas Ver Mensaje
Que versión y edición estas manejando
Uso SQL Server Management Studio 2005.
Atento a tus comentarios.
  #6 (permalink)  
Antiguo 27/05/2014, 15:02
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Cómo reemplazar más de 2 palabras en el mismo registro?

Debes instalar Visual Studio y el servicio de SSIS (Integration Services) de SQL Server 2005

Te falto mencionar que EDICION de SQL Server manejas
__________________
MCTS Isaias Islas
  #7 (permalink)  
Antiguo 27/05/2014, 16:18
 
Fecha de Ingreso: mayo-2014
Mensajes: 9
Antigüedad: 9 años, 10 meses
Puntos: 0
Respuesta: Cómo reemplazar más de 2 palabras en el mismo registro?

Cita:
Iniciado por iislas Ver Mensaje
Que versión y edición estas manejando
Uso SQL Server Management Studio 2005.

Perdón, uso Sql server Management Studio Versión 9 y tengo instalad visual studio 2010 y también SSIS.
Detalle:
Microsoft SQL Server Management Studio 9.00.5000.00
Herramientas cliente de Microsoft Analysis Services 2005.090.5000.00
Microsoft Data Access Components (MDAC) 6.1.7601.17514 (win7sp1_rtm.101119-1850)
Microsoft MSXML 3.0 4.0 5.0 6.0
Microsoft Internet Explorer 9.10.9200.16844
Microsoft .NET Framework 2.0.50727.5477
Sistema operativo 6.1.7601
  #8 (permalink)  
Antiguo 27/05/2014, 20:15
 
Fecha de Ingreso: abril-2012
Ubicación: Capital Federal
Mensajes: 283
Antigüedad: 12 años
Puntos: 15
Respuesta: Cómo reemplazar más de 2 palabras en el mismo registro?

Cita:
Iniciado por patriciodilet Ver Mensaje
Uso SQL Server Management Studio 2005.

Perdón, uso Sql server Management Studio Versión 9 y tengo instalad visual studio 2010 y también SSIS.
Detalle:
Microsoft SQL Server Management Studio 9.00.5000.00
Herramientas cliente de Microsoft Analysis Services 2005.090.5000.00
Microsoft Data Access Components (MDAC) 6.1.7601.17514 (win7sp1_rtm.101119-1850)
Microsoft MSXML 3.0 4.0 5.0 6.0
Microsoft Internet Explorer 9.10.9200.16844
Microsoft .NET Framework 2.0.50727.5477
Sistema operativo 6.1.7601

Aclaro que datacleaning está disponible a partir de la versión 2012 de Sql Server
  #9 (permalink)  
Antiguo 27/05/2014, 22:15
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Cómo reemplazar más de 2 palabras en el mismo registro?

Código SQL:
Ver original
  1. SELECT REPLACE(REPLACE (#datos.direccion, #incorrecto.nombre, #correcto.nombre),#incorrecto.nombre,#correcto.nombre)
  2. FROM  #correcto
  3.     INNER JOIN #incorrecto ON #correcto.id = #incorrecto.id_correcto
  4.     CROSS JOIN #datos  
  5.     WHERE direccion LIKE '% ' + #incorrecto.nombre + '%'

ya probaste con algo asi??
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #10 (permalink)  
Antiguo 28/05/2014, 06:14
 
Fecha de Ingreso: julio-2012
Ubicación: Israel
Mensajes: 360
Antigüedad: 11 años, 9 meses
Puntos: 40
Respuesta: Cómo reemplazar más de 2 palabras en el mismo registro?

Probá este SQL dinámico:
Código SQL:
Ver original
  1. DECLARE @SQL VARCHAR(MAX);
  2. WITH T AS
  3. (SELECT COUNT(*) OVER() N,
  4.         Cr.id,
  5.         Cr.nombre CrNombre,
  6.         InCr.nombre InCrNombre
  7. FROM    #correcto Cr
  8. INNER JOIN #incorrecto InCr
  9.         ON Cr.id=InCr.id_correcto)
  10. SELECT  @SQL='Replace('+IsNull(@SQL+',','direccion,')+''''+InCrNombre+''','''+CrNombre+''')'
  11. FROM    T;
  12. SELECT  @SQL='Select    *,'+CHAR(13)+CHAR(9)+CHAR(9)+@SQL+' direccion_corecto'+CHAR(13)+'From   #datos;';
  13. Print   @SQL;
  14. EXEC(@SQL);
__________________
El Castellano no es mi lengua materna: discúlpenme por los errores gramaticales.
Mi blog
  #11 (permalink)  
Antiguo 28/05/2014, 08:05
 
Fecha de Ingreso: mayo-2014
Mensajes: 9
Antigüedad: 9 años, 10 meses
Puntos: 0
Respuesta: Cómo reemplazar más de 2 palabras en el mismo registro?

Cita:
Iniciado por Libras Ver Mensaje
Código SQL:
Ver original
  1. SELECT REPLACE(REPLACE (#datos.direccion, #incorrecto.nombre, #correcto.nombre),#incorrecto.nombre,#correcto.nombre)
  2. FROM  #correcto
  3.     INNER JOIN #incorrecto ON #correcto.id = #incorrecto.id_correcto
  4.     CROSS JOIN #datos  
  5.     WHERE direccion LIKE '% ' + #incorrecto.nombre + '%'

ya probaste con algo asi??
Si, y quedan cosas raras, como por ejemplo la palabra LOC queda como LOCALA y debería ser LOCAL. Muchas gracias!
  #12 (permalink)  
Antiguo 28/05/2014, 08:11
 
Fecha de Ingreso: mayo-2014
Mensajes: 9
Antigüedad: 9 años, 10 meses
Puntos: 0
Respuesta: Cómo reemplazar más de 2 palabras en el mismo registro?

Cita:
Iniciado por GeriReshef Ver Mensaje
Probá este SQL dinámico:
Código SQL:
Ver original
  1. DECLARE @SQL VARCHAR(MAX);
  2. WITH T AS
  3. (SELECT COUNT(*) OVER() N,
  4.         Cr.id,
  5.         Cr.nombre CrNombre,
  6.         InCr.nombre InCrNombre
  7. FROM    #correcto Cr
  8. INNER JOIN #incorrecto InCr
  9.         ON Cr.id=InCr.id_correcto)
  10. SELECT  @SQL='Replace('+IsNull(@SQL+',','direccion,')+''''+InCrNombre+''','''+CrNombre+''')'
  11. FROM    T;
  12. SELECT  @SQL='Select    *,'+CHAR(13)+CHAR(9)+CHAR(9)+@SQL+' direccion_corecto'+CHAR(13)+'From   #datos;';
  13. Print   @SQL;
  14. EXEC(@SQL);

Eres seco!!!! You're great!!
Funciona perfecto! esto mismo lo hago para normalizar todo el resto de la dirección (nombre de vía) y lo probé con tu método y funciona perfecto. Ahora solo necesito entender tu código, pero de verdad muchas gracias!
  #13 (permalink)  
Antiguo 28/05/2014, 09:07
 
Fecha de Ingreso: mayo-2014
Mensajes: 9
Antigüedad: 9 años, 10 meses
Puntos: 0
Respuesta: Cómo reemplazar más de 2 palabras en el mismo registro?

Cita:
Iniciado por GeriReshef Ver Mensaje
Probá este SQL dinámico:
Código SQL:
Ver original
  1. DECLARE @SQL VARCHAR(MAX);
  2. WITH T AS
  3. (SELECT COUNT(*) OVER() N,
  4.         Cr.id,
  5.         Cr.nombre CrNombre,
  6.         InCr.nombre InCrNombre
  7. FROM    #correcto Cr
  8. INNER JOIN #incorrecto InCr
  9.         ON Cr.id=InCr.id_correcto)
  10. SELECT  @SQL='Replace('+IsNull(@SQL+',','direccion,')+''''+InCrNombre+''','''+CrNombre+''')'
  11. FROM    T;
  12. SELECT  @SQL='Select    *,'+CHAR(13)+CHAR(9)+CHAR(9)+@SQL+' direccion_corecto'+CHAR(13)+'From   #datos;';
  13. Print   @SQL;
  14. EXEC(@SQL);
Esto mismo me gustaría aplicarlo a los nombres de las vías. Pero tengo, por ejemplo, 100.000 nombres de vía incorrectos (o distintas formas de escribir la misma vía) asociados a 20.000 nombres de vía correctos.
Lo estoy intentando con esta query pero demora mucho...
  #14 (permalink)  
Antiguo 29/05/2014, 00:22
 
Fecha de Ingreso: julio-2012
Ubicación: Israel
Mensajes: 360
Antigüedad: 11 años, 9 meses
Puntos: 40
Respuesta: Cómo reemplazar más de 2 palabras en el mismo registro?

Cita:
Iniciado por patriciodilet Ver Mensaje
Esto mismo me gustaría aplicarlo a los nombres de las vías. Pero tengo, por ejemplo, 100.000 nombres de vía incorrectos (o distintas formas de escribir la misma vía) asociados a 20.000 nombres de vía correctos.
Lo estoy intentando con esta query pero demora mucho...
El problema es que si existen 100,000 nombres incorrectos y otros 1,000,000 direcciones (en la tabla #datos) te resulta en 100 billones (100,000,000,000) de operaciones de Replace que en cada cual el sistema busca una subcadena dentro de una cadena.

Supongo que el sistema no utiliza mucho IO, pero sí - mucho CPU.

A partir de la versión 2012 existe la herramienta Data Quality Services que esta dedicada exactamente a estas tarreas (me parece que esto es el servicio que iislas mencionó en su respuesta). No tengo ninguna experiencia con ella.

Un último comentario: ¿porque los correctos e in correctos no estan en una tabla?
La relación entre las dos es 1:1...
__________________
El Castellano no es mi lengua materna: discúlpenme por los errores gramaticales.
Mi blog
  #15 (permalink)  
Antiguo 29/05/2014, 08:50
 
Fecha de Ingreso: mayo-2014
Mensajes: 9
Antigüedad: 9 años, 10 meses
Puntos: 0
Respuesta: Cómo reemplazar más de 2 palabras en el mismo registro?

Cita:
Iniciado por GeriReshef Ver Mensaje
El problema es que si existen 100,000 nombres incorrectos y otros 1,000,000 direcciones (en la tabla #datos) te resulta en 100 billones (100,000,000,000) de operaciones de Replace que en cada cual el sistema busca una subcadena dentro de una cadena.

Supongo que el sistema no utiliza mucho IO, pero sí - mucho CPU.

A partir de la versión 2012 existe la herramienta Data Quality Services que esta dedicada exactamente a estas tarreas (me parece que esto es el servicio que iislas mencionó en su respuesta). No tengo ninguna experiencia con ella.

Un último comentario: ¿porque los correctos e in correctos no estan en una tabla?
La relación entre las dos es 1:1...
Lamentablemente tengo disponible solo la versión 2005 de sql server.

Me equivoqué en el ejemplo, pueden haber 100 errores asociados a un correcto.

Etiquetas: palabras, query, reemplazar, registro, select, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:54.