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

#11 Irak Rubio
18/08/2006 - 17:50 | Informe spam
ok. mira esta es la sentencia:

DECLARE @PKTabuladorDestino integer
DECLARE @Param as nvarchar
SET @Param=0
SET @PKTabuladorDestino=(SELECT PKTabulador
FROM SIOFCTABULADORES WHERE PKCedente=2 AND PKProducto=8
AND PKEspecie=1 AND PKFuncion=1 AND PKRiesgo02 AND
Ejercicio 06 AND
Vigencia=1 AND UnidadVigencia=1 AND Adicionales=0
AND Nivel='91' AND TipoDeducible=0 AND ConFranquicia=0
AND ConParticipacion=0 AND EsSeleccionable=0 AND
RangoVigencia = @Param or (RangoVigencia is null and @Param is null))
SELECT @PKTabuladorDestino

En la tabla hay dos registros con llave identica excepto por el campo
RangoVigencia que
uno tiene valor CERO y la otra esta en NULL.
Cuando le asigno el valor de NULL a mi parametro obtengo lo siguiente:

Server: Msg 512, Level 16, State 1, Line 5
Subquery returned more than 1 value. This is not permitted when the subquery
follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

(1 row(s) affected)

¡Gracias por tu apoyo!
"Alejandro Mesa" escribió:

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

Trata encerrando la expresion logica final entre parentesis. Cual es el tipo
de data de la columna RangoVigencia, nvarchar(1)?

DECLARE @PKTabuladorDestino integer
DECLARE @Param as nvarchar <- buena practica poner la longitud


DECLARE @Param as nvarchar(1)

SET @Param = 0 < asigna un valor del dominio de la columna


SET @Param = N'0'


SET @PKTabuladorDestino=(

SELECT
PKTabulador
FROM
SIOFCTABULADORES
WHERE
PKCedente = 2
AND PKProducto = 8
AND PKEspecie = 1
AND PKFuncion = 1
AND PKRiesgo = 1802
AND Ejercicio = 2006
AND Vigencia = 1
AND UnidadVigencia = 1
AND Adicionales = 0
AND Nivel = '91'
AND TipoDeducible = 0
AND ConFranquicia = 0
AND ConParticipacion = 0
AND EsSeleccionable = 0
AND (RangoVigencia = @Param or (RangoVigencia is null and @Param is null))
)

SELECT @PKTabuladorDestino
go


AMB


"Irak Rubio" wrote:

ok. mira esta es la sentencia:

DECLARE @PKTabuladorDestino integer
DECLARE @Param as nvarchar
SET @Param=0
SET @PKTabuladorDestino=(SELECT PKTabulador
FROM SIOFCTABULADORES WHERE PKCedente=2 AND PKProducto=8
AND PKEspecie=1 AND PKFuncion=1 AND PKRiesgo02 AND
Ejercicio 06 AND
Vigencia=1 AND UnidadVigencia=1 AND Adicionales=0
AND Nivel='91' AND TipoDeducible=0 AND ConFranquicia=0
AND ConParticipacion=0 AND EsSeleccionable=0 AND
RangoVigencia = @Param or (RangoVigencia is null and @Param is null))
SELECT @PKTabuladorDestino

En la tabla hay dos registros con llave identica excepto por el campo
RangoVigencia que
uno tiene valor CERO y la otra esta en NULL.
Cuando le asigno el valor de NULL a mi parametro obtengo lo siguiente:

Server: Msg 512, Level 16, State 1, Line 5
Subquery returned more than 1 value. This is not permitted when the subquery
follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

(1 row(s) affected)

¡Gracias por tu apoyo!
"Alejandro Mesa" escribió:

> 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
#13 Irak Rubio
18/08/2006 - 18:04 | Informe spam
La secuencia logica es asi:
Create MiTabla
(
IdCampo IDENTITY(1,1) NOT NULL,
Campo1 nvarchar(1),
Campo2 nvarchar(1),
Campo3 nvarchar(1),
)
Insert into MiTabla('A','B','C')
Insert into MiTabla('A','B',NULL)

Create Proc GETIdentity
(
@Param1 nvarchar,
@Param2 nvarchar,
@Param3 nvarchar
)
AS
SELECT IdCampo From MiTabla Where
Campo1=@Param1 AND Campo2=@Param2
AND Campo3 = @Param3 or (Campo3 is null and @Param3 is null)

RETURN





"Alejandro Mesa" escribió:

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
#14 Irak Rubio
18/08/2006 - 18:17 | Informe spam
Gracias!!
Ya quedo a la perfeccion...
Enhorabuena!



"Alejandro Mesa" escribió:

Irak Rubio,

Trata encerrando la expresion logica final entre parentesis. Cual es el tipo
de data de la columna RangoVigencia, nvarchar(1)?

DECLARE @PKTabuladorDestino integer
> DECLARE @Param as nvarchar <- buena practica poner la longitud
DECLARE @Param as nvarchar(1)

> SET @Param = 0 < asigna un valor del dominio de la columna
SET @Param = N'0'


SET @PKTabuladorDestino=(

SELECT
PKTabulador
FROM
SIOFCTABULADORES
WHERE
PKCedente = 2
AND PKProducto = 8
AND PKEspecie = 1
AND PKFuncion = 1
AND PKRiesgo = 1802
AND Ejercicio = 2006
AND Vigencia = 1
AND UnidadVigencia = 1
AND Adicionales = 0
AND Nivel = '91'
AND TipoDeducible = 0
AND ConFranquicia = 0
AND ConParticipacion = 0
AND EsSeleccionable = 0
AND (RangoVigencia = @Param or (RangoVigencia is null and @Param is null))
)

SELECT @PKTabuladorDestino
go


AMB


"Irak Rubio" wrote:

> ok. mira esta es la sentencia:
>
> DECLARE @PKTabuladorDestino integer
> DECLARE @Param as nvarchar
> SET @Param=0
> SET @PKTabuladorDestino=(SELECT PKTabulador
> FROM SIOFCTABULADORES WHERE PKCedente=2 AND PKProducto=8
> AND PKEspecie=1 AND PKFuncion=1 AND PKRiesgo02 AND
> Ejercicio 06 AND
> Vigencia=1 AND UnidadVigencia=1 AND Adicionales=0
> AND Nivel='91' AND TipoDeducible=0 AND ConFranquicia=0
> AND ConParticipacion=0 AND EsSeleccionable=0 AND
> RangoVigencia = @Param or (RangoVigencia is null and @Param is null))
> SELECT @PKTabuladorDestino
>
> En la tabla hay dos registros con llave identica excepto por el campo
> RangoVigencia que
> uno tiene valor CERO y la otra esta en NULL.
> Cuando le asigno el valor de NULL a mi parametro obtengo lo siguiente:
>
> Server: Msg 512, Level 16, State 1, Line 5
> Subquery returned more than 1 value. This is not permitted when the subquery
> follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
>
> (1 row(s) affected)
>
> ¡Gracias por tu apoyo!
> "Alejandro Mesa" escribió:
>
> > 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
#15 Alejandro Mesa
18/08/2006 - 19:01 | Informe spam
Irak Rubio,

La secuencia logica es asi:



Aja y cual es el problema?

use northwind
go

create table dbo.t1
(
IdCampo int not null IDENTITY(1,1) unique,
Campo1 nvarchar(1),
Campo2 nvarchar(1),
Campo3 nvarchar(1)
)
go

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

create proc dbo.p1
(
@Param1 nvarchar,
@Param2 nvarchar,
@Param3 nvarchar
)
AS
SELECT
IdCampo
From
dbo.t1
Where
Campo1 = @Param1
AND Campo2 = @Param2
AND Campo3 = @Param3 or (Campo3 is null and @Param3 is null)

RETURN @@error
go

exec dbo.p1 'A', 'B', 'C'
go

exec dbo.p1 'A', 'B', NULL
go

drop procedure dbo.p1
go

drop table dbo.t1
go

Result:

IdCampo
1

(1 row(s) affected)

IdCampo
2


AMB


"Irak Rubio" wrote:

La secuencia logica es asi:
Create MiTabla
(
IdCampo IDENTITY(1,1) NOT NULL,
Campo1 nvarchar(1),
Campo2 nvarchar(1),
Campo3 nvarchar(1),
)
Insert into MiTabla('A','B','C')
Insert into MiTabla('A','B',NULL)

Create Proc GETIdentity
(
@Param1 nvarchar,
@Param2 nvarchar,
@Param3 nvarchar
)
AS
SELECT IdCampo From MiTabla Where
Campo1=@Param1 AND Campo2=@Param2
AND Campo3 = @Param3 or (Campo3 is null and @Param3 is null)

RETURN





"Alejandro Mesa" escribió:

> 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
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida