PDA

Ver la Versión Completa : Actualizar un campo vacio con el valor de otro


jafera
03-07-2013, 17:55:03
Hola de nuevo.

Siguiendo con mis pesquisas sqeleras, tengo una duda de como puedo actualizar el valor de un campo vacio con el valor del campo adyacente, os explico:

El archivo txt en el que me mandan los corredores ciclistas desde la federación, esta separado por comas y su formato es dorsal, nombre, apellido1, apellido2, etc., esto hasta aquí es correcto, luego yo importo estos datos a la tabla Firebird correspondiente y funciona de perlas pero he detectado que los corredores extranjeros que tienen un solo apellido, este no figura en apellido1 sino en apellido 2, con lo cual si hago una busqueda a estos no los encuentro jamás ya que el valor es vacio, como ejemplo:

1, Josep, Fernandez, Alberti,etc.
2, Lio, ,Chin,etc.
3, Johny, ,Walker,etc.
4, Antonio, Gomez, Perez,etc.

Lo que yo necesitaria seía que una vez importados los datos a la tabla, pudiera recorrer la tabla y cambiar el valor de los registros 2 y 3 (que son los que estan vacios en apellido1) y que la tabla quedara así:

1, Josep, Fernandez, Alberti,etc.
2, Lio, Chin, ,etc.
3, Johny, Walker, ,etc.
4, Antonio, Gomez, Perez,etc.

He probado con update si campo apellido 2 = vacio que apellido 1=apellido2 y luego apellido2 = vacio, pero claro me los cambia todos.

No se si alguien se ha encontrado con un problema similar y que solución le ha dado

Muchas gracias

Josep

ElDioni
03-07-2013, 18:25:43
He probado con update si campo apellido 2 = vacio que apellido 1=apellido2 y luego apellido2 = vacio, pero claro me los cambia todos.


Si lo has hecho así te quedaría que todos los que tengan el apellido2 vacio también tengan vacio el apellido1 y por si acaso no estaba suficientemente vacio el apellido2 lo vuelves a vaciar.

Creo que sería algo como

UPDATE corredores SET apellido1=apellido2,apellido2='' WHERE apellido1 is null


Supongo que con algo así funcionaría dando por echo que realizará la primera actualización antes que la segunda.

También podría hacer la comprobación a la hora de volcar los datos a la tabla firebird, no se como haces el traspaso de un lado a otro pero doy por sentado que en algún momento podrías meter la comprobación.

Por último podrías hacer que al buscar por apellido no hagas dos campos de búsqueda, uno para el apellido1 y otro para el apellido2, yo pondría un solo campo que sería apellido y luego buscaría en la tabla coincidencias en los dos campos.

SELECT * FROM corredores WHERE apellido1 LIKE '%ernandez%' OR apellido2 LIKE '%ernandez%'


Saludos.

jafera
03-07-2013, 19:10:35
Gracias por la respuesta.

El update propuesto ha funcionado bien, no sabia que podia actualizar de una tacada los dos campos.

El método de insercion de datos en la tabla es este:


IBSQLMaster.SQL.Text := 'Insert into CTR0003C values(:C1, :C2, :C3, :C4, :C5, :C6, :C7, :C8, :C9, :C10, :C11, :C12)';
F := TIBInputDelimitedFile.Create;
try
F.ColDelimiter:=';';
F.Filename := 'C:\Trial_1.0\Masters\Master.txt';
IBSQLMaster.BatchInput(F);
finally
F.Free;
end;


Donde apellido1 es C3 y apellido2 es C4

En cuanto a la busqueda lo hago por un campo union de apellido1 + apellido2 + nombre

Saludos

Josep

ElDioni
03-07-2013, 19:22:28
En cuanto a la busqueda lo hago por un campo union de apellido1 + apellido2 + nombre



Hola, si es así, entonces, podrías utilizar LIKE para que de igual que busques por el apellido1, apellido2 o nombre.

Saludos.

jafera
03-07-2013, 19:34:19
Gracias de nuevo.

Realmente el metodo de busqueda no me preocupaba, pero gracias por tu interés, el que realmente era un quebradero es el que he solucionado con el update que mes has propuesto.

Te he pasado el metodo de inserción pues he entendido que igual se podria predecir que el campo esta vacio en este proceso de insercion de datos y modificarlo durante.

Saludos

Josep

Nota: Cada dia con vosotros aprendo una cosita nueva de esto del SQL, sois unos catacracks (más que cracks).

Ahora solo me falta aprender como optimizar una consulta para actualizar 35.000 registros de una tabla a otra y que no me demore mucho tiempo, estoy en ello pero lo pongo a cocer, me voy a tomar cafe y a la vuelta termina, jejeje...