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

#6 Irak Rubio
18/08/2006 - 16:25 | Informe spam
Por cierto Alejandro, lo mismo que ocurre con el SET ANSI_NULLS ocurre con
todos los SETS que usemos? como por ej. el SET NOCOUNT... ??

"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
#7 Irak Rubio
18/08/2006 - 17:04 | Informe spam
Bueno amigos... ustedes disculpen, pero he probado las posibles soluciones y
las cercana ha sido la del amigo Ricardo Passians.
Veran, el utilizar un "OR" para definir un caso de valor nulo o no, me trajo
como resultado dos valores (siendo que necesito solamente uno) ya que la
llave de los registros estaban asi:

Campo 1 - Campo 2 - Campo 3
A B NULL
A B C

Aun y cuando yo estoy buscando a C, obtengo ambos registros (OR)
o viceversa.

En el caso de Ricardo, es correcto pero el problema es mayor cuando tengo que
evaluar varias columnas de la misma forma: (cuantas combinaciones tendria
que hacer en mi caso si son tres columnas las que pueden tener o no un valor
nulo)

Campo 1 - Campo 2 - Campo 3
A B NULL
A NULL C
NULL B C
NULL NULL C
. . . .


Amigos... Estoy frito. :-)




"Irak Rubio" escribió:

Por cierto Alejandro, lo mismo que ocurre con el SET ANSI_NULLS ocurre con
todos los SETS que usemos? como por ej. el SET NOCOUNT... ??

"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
#8 Alejandro Mesa
18/08/2006 - 17:18 | Informe spam
Irak Rubio,

Por cierto Alejandro, lo mismo que ocurre con el SET ANSI_NULLS ocurre con
todos los SETS que usemos? como por ej. el SET NOCOUNT... ??



No, no es asi. Fijate bien en el ejemplo que postee sobre el tema. En el
segundo procedimineto uso todavia "set nocount on" y sin embargo no ocurre el
evento de recompilacion.

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



Generalmente cuando se cambian las opciones que alteran el comportamiento
del query o el resultado, tales como:

ANSI_DEFAULTS
ANSI_NULL_DFLT_OFF
ANSI_NULL_DFLT_ON
ANSI_NULLS
ANSI_PADDING
CONCAT_NULL_YIELDS_NULL
FORCEPLAN
ANSI_WARNINGS
ARITHABORT
LANGUAGE
NUMERIC_ROUNDABORT
QUOTED_IDENTIFIER

Aca te adjunto un documento que habla sobre el tema.

Query Recompilation in SQL Server 2000
http://msdn.microsoft.com/library/d...lation.asp


AMB


"Irak Rubio" wrote:

Por cierto Alejandro, lo mismo que ocurre con el SET ANSI_NULLS ocurre con
todos los SETS que usemos? como por ej. el SET NOCOUNT... ??

"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
#9 Alejandro Mesa
18/08/2006 - 17:29 | Informe spam
Irak Rubio,

Veran, el utilizar un "OR" para definir un caso de valor nulo o no, me trajo
como resultado dos valores (siendo que necesito solamente uno) ya que la
llave de los registros estaban asi:

Campo 1 - Campo 2 - Campo 3
A B NULL
A B C



Yo no obtengo el mismo resultado, pudieras postear la expresion logica que
estas usando?

Ejemplo:

create table dbo.t1 (
Campo1 varchar(15),
Campo2 varchar(15),
Campo3 varchar(15)
)
go

insert into dbo.t1 values('A', 'B', NULL)
insert into dbo.t1 values('A', 'B', 'C')
go

create procedure dbo.p1
@campo3 varchar(25)
as
set nocount on

select campo1, campo2, campo3
from dbo.t1
where campo3 = @campo3 or (campo3 is null and @campo3 is null)

return @@error
go

exec dbo.p1 'C'
go

exec dbo.p1 NULL
go

drop procedure dbo.p1
go

drop table dbo.t1
go

Result:


(1 row(s) affected)


(1 row(s) affected)

campo1 campo2 campo3

A B C

campo1 campo2 campo3

A B NULL



AMB




"Irak Rubio" wrote:

Bueno amigos... ustedes disculpen, pero he probado las posibles soluciones y
las cercana ha sido la del amigo Ricardo Passians.
Veran, el utilizar un "OR" para definir un caso de valor nulo o no, me trajo
como resultado dos valores (siendo que necesito solamente uno) ya que la
llave de los registros estaban asi:

Campo 1 - Campo 2 - Campo 3
A B NULL
A B C

Aun y cuando yo estoy buscando a C, obtengo ambos registros (OR)
o viceversa.

En el caso de Ricardo, es correcto pero el problema es mayor cuando tengo que
evaluar varias columnas de la misma forma: (cuantas combinaciones tendria
que hacer en mi caso si son tres columnas las que pueden tener o no un valor
nulo)

Campo 1 - Campo 2 - Campo 3
A B NULL
A NULL C
NULL B C
NULL NULL C
. . . .


Amigos... Estoy frito. :-)




"Irak Rubio" escribió:

> Por cierto Alejandro, lo mismo que ocurre con el SET ANSI_NULLS ocurre con
> todos los SETS que usemos? como por ej. el SET NOCOUNT... ??
>
> "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
#10 Alejandro Mesa
18/08/2006 - 17:41 | Informe spam
Ricardo,

Si tengo que escoger una de las dos opciones, escogeria usar el "IF", porque
el uso de la funcion "ISNULL" puede llevar a SQL Server a no usar los indices
de forma optima en caso de estos existieran.

Vamos a postear un ejemplo para mostrar lo dicho. Si vas a la db "northwind"
y ejecutamos la siguiente sentencia:

use northwind
go

exec sp_helpindex 'customers'
go

Veremos que esta tabla tiene un indice por la columna [region], la cual es
nvarchar(15) y acepta valor NULL. Si creamos los siguientes procedimientos y
los ejecutamos con los mismos valores en sus parametro, veras que el
procedmiento que usa la funcion "ISNULL" en la clausula "where", hace que SQL
Server realize un scan del indice y no un "index seek".

create procedure dbo.p1
@region nvarchar(15)
as
set nocount on

select CustomerID, CompanyName, ContactName, ContactTitle, Address, region,
Region, PostalCode, Country, Phone, Fax
from dbo.Customers
where region = @region or (region is null and @region is null)

return @@error
go

create procedure dbo.p2
@region nvarchar(15)
as
set nocount on

select CustomerID, CompanyName, ContactName, ContactTitle, Address, region,
Region, PostalCode, Country, Phone, Fax
from dbo.Customers
where isnull(region, '') = isnull(@region, '')

return @@error
go

set showplan_text on
go

exec dbo.p1 'SP'
go

exec dbo.p1 NULL
go

exec dbo.p2 'SP'
go

exec dbo.p2 NULL
go

set showplan_text off
go

drop procedure dbo.p1, dbo.p2
go

Result:


|--Bookmark Lookup(BOOKMARK:([Bmk1000]),
OBJECT:([northwind].[dbo].[Customers]))
|--Index Seek(OBJECT:([northwind].[dbo].[Customers].[Region]),
SEEK:([Customers].[Region]=[@region]) ORDERED FORWARD)


|--Bookmark Lookup(BOOKMARK:([Bmk1000]),
OBJECT:([northwind].[dbo].[Customers]))
|--Index Seek(OBJECT:([northwind].[dbo].[Customers].[Region]),
SEEK:([Customers].[Region]=[@region]) ORDERED FORWARD)


|--Bookmark Lookup(BOOKMARK:([Bmk1000]),
OBJECT:([northwind].[dbo].[Customers]))
|--Index Scan(OBJECT:([northwind].[dbo].[Customers].[Region]),
WHERE:(isnull([Customers].[Region], '')=isnull([@region], '')))


|--Bookmark Lookup(BOOKMARK:([Bmk1000]),
OBJECT:([northwind].[dbo].[Customers]))
|--Index Scan(OBJECT:([northwind].[dbo].[Customers].[Region]),
WHERE:(isnull([Customers].[Region], '')=isnull([@region], '')))



AMB

"Ricardo Passians" wrote:

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 AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida