clausula case en el where de un update, o, como eliminar ceros iniciales

02/05/2006 - 21:23 por .·:m·a·r·l·a:·. | Informe spam
Hola a todos

quiero hacer un upddate en una tabla buscando los valores en otra tabla, el
problema es que las relaciones entre tablas son entre campos varchar aunque
en la mayoria de los casos deverian contener valores validos como numericos

por ello busco una forma que cruze valores tal que '012345' y '12345' y que
no se pare cuando encuentre '12x45'


el ejemplo que tengo es

UPDATE tabla1
SET campo4 = tabla2.campo4
from tabla1, tabla2
where
tabla1.campo1 = tabla2.campo1

pero no funciona para '012345' y '12345', pruebo entonces cambiando el where
a


where
cast(tabla1.campo1 as bigint) = cast(tabla2.campo1 as bigint)


pero, por supuesto, se para cuando encuentra alguna valor no numerico, asi
pense en ::


where
case when (isnumeric(tabla1.campo1 ))
then cast(tabla1.campo1 as bigint)
else tabla1.campo1
end
case when (isnumeric(tabla2.campo1 ))
then cast(tabla2.campo1 as bigint)
else tabla2.campo1
end


intentando que en caso de encontrar un valor que se pueda convertir a bigint
lo compare como bigint, y si no utilice varchar, pero el error devuelto es
::

Server: Msg 156, Level 15, State 1, Line 14
Incorrect syntax near the keyword 'then'.


quizas tambien me sirviera alguna funcion que me permitira eliminar los
ceros del principio y comparar las cadenas, pero que no eliminara los ceros
intermedios


alguna idea, gracias por adelantado

Preguntas similare

Leer las respuestas

#1 Maxi [MVP]
03/05/2006 - 03:54 | Informe spam
mmm y siempre sigue la misma regla? o sea siempre hay un 0 a la izquierda?


Salu2
-
[Microsoft MVP] SQL Server
Orador para Culminis Latam
www.sqlgurus.org

MSN:

".·:m·a·r·l·a:·." escribió en el mensaje
news:
Mostrar la cita
#2 BitOne®
03/05/2006 - 05:06 | Informe spam
Mira te tengo una solucion, no es la mas optima pues no he tenido el tiempo
para optimizar
pero resuelve tu problema de actualizacion hasta el punto que he
comprendido, que creo
que es el que tratas por lo que expresas.

te explico y luego muestro el ejemplo.

Primero en lo adentro, tomas una subconsulta y devuelves los valores
alphanumericos con
su clave correcta como esta en la tabla maestra y el campo que actualizara
el valor,
luego repites el mismo paso pero para los numericos, luego esto lo colocas
dentro de union
con una su consulta y comparas claves reales contra su misma tabla y
entonces puedes
hacer el update a tu manera.

REPITO: no es lo mas optimo pero puede ser simplificado, pues tiene un par
de pasitos de mas
esto lo dejo para que mejores el algoritmo cuando lo implementes.


antes de ejectuar

clave actualizara

1234 numerico
14x14 alpha
0123m alpha

(3 row(s) affected)

clave actualizare

01234 prueba
14x14 prueba
123m prueba

(3 row(s) affected)


Luego de Ejecutar

clave actualizara

1234 numerico
14x14 alpha
0123m alpha

(3 row(s) affected)

clave actualizare

01234 numerico
14x14 alpha
123m prueba

(3 row(s) affected)




ya basta de conversar y mira el ejemplo... puedes copiar y pegar a gusto SQL
2000

/**************************** GENESIS (ALPHA)
******************************/

use pubs

/******
*
* Crea tabla de prueba que sera actualiza,
* Campo que tendra la clave a ser comparada,
* y campo a ser actualizado
*/

create table aActualizar (
clave varchar(15),
actualizare varchar(15)
)
go

/******
*
* Crea tabla de prueba que actualizará
* Campo que tendra la clave a ser comparada,
* y campo a sera quien actuliza
*/

create table Actualizara (
clave varchar(15),
actualizara varchar(15)
)
go

/******
* Inserta registros de prueba
*
*/
insert into aActualizar values ( '01234', 'prueba')
insert into aActualizar values ( '14x14', 'prueba')
insert into aActualizar values ( '123m', 'prueba')
go
/******
* Inserta registros de prueba
*
*/
insert into Actualizara values ( '1234', 'numerico')
insert into Actualizara values ( '14x14', 'alpha')
insert into Actualizara values ( '0123m', 'alpha')
go

/******
* Inicia transaccion para volver a probar
*
*/

begin tran

select * from aActualizar --Muestra los registros en su estado actual

update a
set actualizare = actualizarab --envia actualizacion con el valor
recuperado y su clave


from aActualizar a inner join
(
select a.clave [clavea],
a.actualizare [actualizarea],
b.clave [claveb],
b.actualizara [actualizarab]

from aActualizar a inner join ( select clave, actualizara from Actualizara
where isnumeric(clave) = 1) b
on convert(bigint,a.clave) = b.clave
and isnumeric(a.clave) = 1
Union
select a.clave [clavea],
a.actualizare [actualizarea],
b.clave [claveb],
b.actualizara [actualizarab]

from aActualizar a inner join ( select clave, actualizara from Actualizara
where isnumeric(clave) = 0) b
on a.clave = b.clave
and isnumeric(a.clave) = 0) b
on a.clave = b.clavea

select * from aActualizar -- muestra tabla actualizada correctamente con
sus valores

Rollback --devuelve transaccion para volver a probar


/**************** APOCALIPSIS (OM3GA) ************************/


Largo por la explicacion, puede reducirce quizas a 7 lineas no mas.

Saludos
BitOne®

"Maxi [MVP]" escribió en el mensaje
news:
Mostrar la cita
asi
Mostrar la cita
es
Mostrar la cita
#3 Alejandro Mesa
03/05/2006 - 14:27 | Informe spam
Trata,

Supongamos que ambas columnas son varchar(15).

UPDATE tabla1
SET tabla1.campo4 = tabla2.campo4
from tabla1, tabla2
where
right(replicate('0', 15) + tabla1.campo1, 15) = right(replicate('0', 15)
+ tabla1.campo2, 15)
and tabla1.campo1 not like '%[^0-9]%'
and tabla2.campo1 not like '%[^0-9]%'

La expresion logica:

and tabla1.campo1 not like '%[^0-9]%'

excluye las filas donde la columna contiene algun caracter que no es numerico.

Ejemplo:

select c1
from
(
select '12x4' as c1
union all
select '124' as c1
) as t
where c1 not like '%[^0-9]%'
go


AMB


".·:m·a·r·l·a:·." wrote:

Mostrar la cita
#4 .·:m·a·r·l·a:·.
03/05/2006 - 16:25 | Informe spam
muchas gracias, pero al final lo resulvi utilizando la idea de alejandro , y
es añadiendo un monton de ceros al inicio y utilizar los (por ejemplo) 15
caracteres mas a la derecha

gracias, le di un vistazo y me parecio muy interesante tu idea, aunque mas
compleja


"BitOne®" wrote in message
news:
Mostrar la cita
tiempo
Mostrar la cita
SQL
Mostrar la cita
izquierda?
Mostrar la cita
tabla,
Mostrar la cita
y
Mostrar la cita
devuelto
Mostrar la cita
los
Mostrar la cita
#5 .·:m·a·r·l·a:·.
03/05/2006 - 16:25 | Informe spam
muchas gracias, asi lo hice (poner mas ceros en lugar de quitar)

saludos


"Alejandro Mesa" wrote in message
news:
Mostrar la cita
15)
Mostrar la cita
numerico.
Mostrar la cita
el
Mostrar la cita
aunque
Mostrar la cita
numericos
Mostrar la cita
que
Mostrar la cita
where
Mostrar la cita
asi
Mostrar la cita
bigint
Mostrar la cita
es
Mostrar la cita
ceros
Mostrar la cita
Ads by Google
Search Busqueda sugerida