NULL... (que dolor de cabeza)

18/08/2006 - 00:13 por Irak Rubio | Informe spam
Trato de entender al incomprendido null pero hasta para algo tan sencillo, no
encuentro la respuesta.

Resulta que tengo un campo alfanumerico que puede albergar NULL,'A','B'
...etc.

y ahora quiero una consulta que me filtre los datos dependiendo de un
parametro que puede o no contener un null.

entonces..
Si el parametro contiene un valor nulo

debo poner:
Select MisRegistros From MiTabla Where MiCampo IS MiParametro (el nulo)

y en caso contrario:
Select MisRegistros From MiTabla Where MiCampo = MiParametro

ahora, ¿Como le hago en mi consulta para que me de la respuesta correcta
aun y cuando yo no sepa si va a ser nulo o no el parametro...
Gracias.

Preguntas similare

Leer las respuestas

#1 Irak Rubio
18/08/2006 - 00:27 | Informe spam
Bueno, gracias Mimismo...
encontre una solucion (aunque no sé si sea la mas adecuada)

SET ANSI_NULLS OFF
SELECT idTabulador FROM TABULADORES WHERE
RangoVigencia = null
SET ANSI_NULLS ON

"Irak Rubio" escribió:

Trato de entender al incomprendido null pero hasta para algo tan sencillo, no
encuentro la respuesta.

Resulta que tengo un campo alfanumerico que puede albergar NULL,'A','B'
...etc.

y ahora quiero una consulta que me filtre los datos dependiendo de un
parametro que puede o no contener un null.

entonces..
Si el parametro contiene un valor nulo

debo poner:
Select MisRegistros From MiTabla Where MiCampo IS MiParametro (el nulo)

y en caso contrario:
Select MisRegistros From MiTabla Where MiCampo = MiParametro

ahora, ¿Como le hago en mi consulta para que me de la respuesta correcta
aun y cuando yo no sepa si va a ser nulo o no el parametro...
Gracias.


Respuesta Responder a este mensaje
#2 Isaias
18/08/2006 - 01:00 | Informe spam
Creo que la mejor solucion es:

SELECT idTabulador FROM TABULADORES WHERE
RangoVigencia IS NULL
Saludos
IIslas


"Irak Rubio" wrote:

Bueno, gracias Mimismo...
encontre una solucion (aunque no sé si sea la mas adecuada)

SET ANSI_NULLS OFF
SELECT idTabulador FROM TABULADORES WHERE
RangoVigencia = null
SET ANSI_NULLS ON

"Irak Rubio" escribió:

> Trato de entender al incomprendido null pero hasta para algo tan sencillo, no
> encuentro la respuesta.
>
> Resulta que tengo un campo alfanumerico que puede albergar NULL,'A','B'
> ...etc.
>
> y ahora quiero una consulta que me filtre los datos dependiendo de un
> parametro que puede o no contener un null.
>
> entonces..
> Si el parametro contiene un valor nulo
>
> debo poner:
> Select MisRegistros From MiTabla Where MiCampo IS MiParametro (el nulo)
>
> y en caso contrario:
> Select MisRegistros From MiTabla Where MiCampo = MiParametro
>
> ahora, ¿Como le hago en mi consulta para que me de la respuesta correcta
> aun y cuando yo no sepa si va a ser nulo o no el parametro...
> Gracias.
>
>
Respuesta Responder a este mensaje
#3 Ricardo Passians
18/08/2006 - 13:22 | Informe spam
Y por que no usas un simple IF ?

IF @MIPARAMETRO IS NULL

Select MisRegistros From MiTabla Where MiCampo IS NULL

ELSE

Select MisRegistros From MiTabla Where MiCampo = @MiParametro



Otra opcion sería aplicando la función ISNULL tanto al campo como al
parámetro.


"Irak Rubio" escribió en el mensaje
news:
Trato de entender al incomprendido null pero hasta para algo tan sencillo,
no
encuentro la respuesta.

Resulta que tengo un campo alfanumerico que puede albergar NULL,'A','B'
...etc.

y ahora quiero una consulta que me filtre los datos dependiendo de un
parametro que puede o no contener un null.

entonces..
Si el parametro contiene un valor nulo

debo poner:
Select MisRegistros From MiTabla Where MiCampo IS MiParametro (el nulo)

y en caso contrario:
Select MisRegistros From MiTabla Where MiCampo = MiParametro

ahora, ¿Como le hago en mi consulta para que me de la respuesta correcta
aun y cuando yo no sepa si va a ser nulo o no el parametro...
Gracias.


Respuesta Responder a este mensaje
#4 Alejandro Mesa
18/08/2006 - 14:16 | Informe spam
Irak,

Aunque reconozco que la solución que encontrastes parece sencilla, en
realidad no lo es y voy a comentar por que no lo es. Cambiar la propiedad
"ansi_nulls" en teimpo de ejecución provoca que el procedimiento almacenado
sea recompilado cada vez que se ejecuta, quitandonos la ventaja de reusar un
plan de ejecución compilado que este en el cache.

Ejemplo:

create procedure dbo.p1
@orderid int
as
set nocount on
set ansi_nulls off

select *
from dbo.orders
where orderid = @orderid

return @@error
go

exec dbo.p1 10250
go

exec dbo.p1 10251
go

drop procedure dbo.p1
go

Si usamos el utilitario "Profiler" para iniciar una traza en el servidor e
incorporamos el evento SP:Recompile, pudieramos ver lo siguiente:

SP:StmtStarting -- p1 set nocount on
SP:StmtStarting -- p1 set ansi_nulls off
SP:StmtStarting -- p1 select * from dbo.orders where orderid = @orderid
SP:Recompile
SP:StmtStarting -- p1 select * from dbo.orders where orderid = @orderid
SP:StmtStarting -- p1 return @@error
SP:StmtStarting -- p1 set nocount on
SP:StmtStarting -- p1 set ansi_nulls off
SP:StmtStarting -- p1 select * from dbo.orders where orderid = @orderid
SP:Recompile
SP:StmtStarting -- p1 select * from dbo.orders where orderid = @orderid
SP:StmtStarting -- p1 return @@error

Si comentamos la sentencia "set ansi_nulls off",

alter procedure dbo.p1
@orderid int
as
set nocount on

select *
from dbo.orders
where orderid = @orderid

return @@error
go

y ejecutamos el sp nuevamente, veremos:

SP:StmtStarting -- p1 set nocount on -- set ansi_nulls off
SP:StmtStarting -- p1 select * from dbo.orders where orderid = @orderid
SP:StmtStarting -- p1 return @@error
SP:StmtStarting -- p1 set nocount on -- set ansi_nulls off
SP:StmtStarting -- p1 select * from dbo.orders where orderid = @orderid
SP:StmtStarting -- p1 return @@error

Creo que el ejemplo habla por si mismo.

A continuacion les paso un link que apunta a un ejercicio muy interesante,
en el cual se pide que adivinemos el resultado final, sin correr el script,
cuando la opcion "ansi_nulls" esta apagada. Les invito a que hagan el
ejercicio y comprueben despues con el resultado producto de correr el script.
Se asombraran cuan impredecible es el resultado cuando "ansi_nulls" esta
apagado.

A NULL Puzzle (by Steve Kass)
http://groups.google.com/group/micr...&hl=en


Una posible solución puede ser usar el operador logico "OR" en conjunto con
la expresion logica que chequea si la columna y el parametro son NULL.

select *
from dbo.t1
where mi_column = @mi_parametro or (mi_columna is null and @mi_parametro is
null)
go


AMB

"Irak Rubio" wrote:

Bueno, gracias Mimismo...
encontre una solucion (aunque no sé si sea la mas adecuada)

SET ANSI_NULLS OFF
SELECT idTabulador FROM TABULADORES WHERE
RangoVigencia = null
SET ANSI_NULLS ON

"Irak Rubio" escribió:

> Trato de entender al incomprendido null pero hasta para algo tan sencillo, no
> encuentro la respuesta.
>
> Resulta que tengo un campo alfanumerico que puede albergar NULL,'A','B'
> ...etc.
>
> y ahora quiero una consulta que me filtre los datos dependiendo de un
> parametro que puede o no contener un null.
>
> entonces..
> Si el parametro contiene un valor nulo
>
> debo poner:
> Select MisRegistros From MiTabla Where MiCampo IS MiParametro (el nulo)
>
> y en caso contrario:
> Select MisRegistros From MiTabla Where MiCampo = MiParametro
>
> ahora, ¿Como le hago en mi consulta para que me de la respuesta correcta
> aun y cuando yo no sepa si va a ser nulo o no el parametro...
> Gracias.
>
>
Respuesta Responder a este mensaje
#5 Irak Rubio
18/08/2006 - 15:58 | Informe spam
Ok. amigos, muchas gracias por sus comentarios.
cambiare entonces el ANSI, (de todas formas cuando lo puse en accion no me
respeto en las subconsultas). pero lo mas obvio y logico (que hasta me da
coraje que no se me haya ocurrido) es pensar en las dos alternativas que me
han propuesto ustedes. Gracias nuevamente. ;-)

"Ricardo Passians" escribió:

Y por que no usas un simple IF ?

IF @MIPARAMETRO IS NULL

Select MisRegistros From MiTabla Where MiCampo IS NULL

ELSE

Select MisRegistros From MiTabla Where MiCampo = @MiParametro

.

Otra opcion sería aplicando la función ISNULL tanto al campo como al
parámetro.


"Irak Rubio" escribió en el mensaje
news:
> Trato de entender al incomprendido null pero hasta para algo tan sencillo,
> no
> encuentro la respuesta.
>
> Resulta que tengo un campo alfanumerico que puede albergar NULL,'A','B'
> ...etc.
>
> y ahora quiero una consulta que me filtre los datos dependiendo de un
> parametro que puede o no contener un null.
>
> entonces..
> Si el parametro contiene un valor nulo
>
> debo poner:
> Select MisRegistros From MiTabla Where MiCampo IS MiParametro (el nulo)
>
> y en caso contrario:
> Select MisRegistros From MiTabla Where MiCampo = MiParametro
>
> ahora, ¿Como le hago en mi consulta para que me de la respuesta correcta
> aun y cuando yo no sepa si va a ser nulo o no el parametro...
> Gracias.
>
>



Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida