En Oracle: = '' y 'es nulo' devuelve valores NULL

 SELECT COL1 FROM TABLE WHERE COL1='' --> RETURN COL1 WITH NULL VALUES
 SELECT COL1 FROM TABLE WHERE COL1 IS NULL --> RETURN COL1 WITH NULL VALUES

Ambas consultas devuelven el mismo conjunto de filas.

En Microsoft SQL:

SELECT COL1 FROM TABLE WHERE COL1='' --> RETURN COL1 WITH <BLANK> VALUES
SELECT COL1 FROM TABLE WHERE COL1 IS NULL --> RETURN COL1 WITH <NULL> VALUES

Aquí la primera y la segunda consulta devuelven diferentes conjuntos de filas.

¿Por qué hay una diferencia entre el conjunto de resultados de Microsoft SQL y el conjunto de resultados de Oracle?

¿Cómo podría recuperar ambos conjuntos de filas en Microsoft SQL? (Valores que son '' y valores que son NULL).

0
Veera V 23 dic. 2016 a las 17:35

3 respuestas

La mejor respuesta

En SQL Server '' no es nulo. En Oracle es un poco complicado x char := '' no es nulo en PL/SQL pero como varchar2 la cadena vacía '' es exactamente igual que null como se explica here Y en caso de consultas, esto es varchar2 entonces la condición COL = '' nunca es cierta.

Si necesita una condición que funcione en ambos DB, use la función coalesce.

select * from TAB 
  where coalesce(COL,'SOME_UNIQUE_STRING') = coalesce(FILTER_PARAM, 'SOME_UNIQUE_STRING')

Dicha condición debería devolver filas cuando COLUMN es igual a FILTER y ambas son cadenas nulas o vacías.

0
Community 23 may. 2017 a las 11:53

Para evitar definir una cadena única, puede usar una declaración de caso.

De esta forma evaluamos col cuando es nulo o está vacío con el mismo valor para la comparación. Como el caso que yo sepa es independiente del DBMS, esto debería funcionar en ambos.

SELECT *
FROM Table
WHERE case when col is NULL or col = '' then 1 else 0 end = 1
0
xQbert 23 dic. 2016 a las 18:43

Para recuperar ambos conjuntos de datos, puede usar isnull.

SELECT COL1 FROM TABLE WHERE ISNULL(COL1, '') = ''

Oracle convierte automáticamente las cadenas vacías en valores nulos, y el servidor sql no, por lo que los conjuntos de resultados son diferentes.

Puede encontrar más información sobre esto aquí: ¿Por qué Oracle 9i trata una cadena vacía como NULL?

0
Community 23 may. 2017 a las 12:09