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:
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



Respuesta Responder a este mensaje
#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:
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:
> 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
>
>
>


Respuesta Responder a este mensaje
#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:

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




Respuesta Responder a este mensaje
#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:
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:
> 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:
> > 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
> >
> >
> >
>
>


Respuesta Responder a este mensaje
#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:
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:

> 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
>
>
>
>
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida