Machetes Varios

apuntes varios erp cwa logic ( ahora SoftLand Logic ) – sql y veremos que otra cosa

Guarda con el NULL ( o Desconocido )


IDOSC: 47010

SEPTIEMBRE 2005

ILZIK BEN-GAN

 

Ejercicio: cual es el resultado de

 

U = ( 2,7,9 )

V =( 3,7,NULL)

 

SELECT * FROM U WHERE

Col1 NOT IN ( SELECT col1 FROM V)

 

Si ud. Contestó 2 y 9 siga leyendo la nota …

No olvidarse de “Desconocido”

ANSI SQL soporta 3 estados: TRUE, FALSE Y DESCONOCIDO(NULL)

 

3>5 es TRUE

3 = NULL es DESCONICIDO ( NULL)

 

Si se quiere saber si un determinado valor es NULL, se debe expresar

 

Col1 IS NULL , y no col1 = NULL

 

Comportamiento

En filtros como ON, WHERE,HAVING: NULL Se comporta como FALSE

 

SELECT * FROM customers WHERE Region = ‘WA’ dejará afuera las regions distintas de ‘WA’ y los valores NULL

 

En expresiones usadas en constraints: Se comporta como TRUE

 

Ej. Para la sgte regla

 

CHECK(Region =’WA’)

 

En la columna Region se podrá indroducir solamente ‘WA’ o NULL

 

Volviendo a la situación original

U = ( 2,7,9 )

V =( 3,7,NULL)

 

SELECT * FROM U WHERE

Col1 NOT IN ( SELECT col1 FROM V)

 

No traerá registros, ya que el NULL de V es desconocido ( “podria tomar cualquier valor”), así que no podemos asegurar que no sea un 2 o un 9.

 

7 NOT IN (3,7,NULL) =

NOT ( 7=3 or 7=7 or 7=NULL)

NOT( FALSE or TRUE or UNKNOW)

NOT(TRU)

FALSE

 

2 NOT IN (3,7,NULL) =

NOT ( 2=3 or 2=7 or 2=NULL)

NOT ( FALSE OR FALSE OR UNKNOW)

NOT(UNKNOW)

UNKNOW

 

 

Para que traiga 7 o 9:

SELECT * FROM U WHERE col1 NOT IN

( SELECT col1 FROM V WHERE col1 IS NOT NULL)

 

o

 

SELECT * FROM U WHERE NOT EXISTS

( SELECT * FROM V where V.col1 = U.col1)

NULL y las expresiones escalares

SELECT 5 + NULL = NULL

SELECT ‘abc’ + null = NULL

 

Group By y Distinct

 

T-SQL lo considera como un valor único.

 

SELECT region, Count(*) as cnt

FROM customeres

GROUP BY region

 

Trae a NULL como un valor separado con su contador.

 

Si ponemos la constraint UNIQUE sobre una columna solamente se permitirá un valor NULL en ésta, y los otros se acusarán como duplicados.

 

Si queremos asegurarnos de que no se repitan los valores no nulos debemos hacerlo por trigger o mediante una vista indexada:

 

CREATE TABLE dbo.T1( c1 int )

GO

CREATE View dbo.VT1 WITH

SCHEMABINDING

AS

SELECT c1

FROM dbo.T!

Where C1 is not null

Go

CREATE UNIQUE CLUSTERED INDEX

Idx1 ON dbo.VT1(c1)

 

 

Union, Except , Intersect

Tratan a NULL como igual ( por ejemplo cuando con UNION se compara dos registros para eliminar registros repetidos )

 

ORDER BY

 

Transact SQL pone los valores NULL antes que los demás.

 

Artículos Relacionados:

 

Handling NULL values in SQL Server 2005

 

abril 17, 2006 - Posted by | SQL Server, Transact SQL

Aún no hay comentarios.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: