sql >> Base de Datos >  >> RDS >> Sqlserver

Cómo funciona NULLIF() en SQL Server

En SQL Server, NULLIF() expresión comprueba el valor de dos expresiones especificadas. Devuelve un valor nulo si son iguales, de lo contrario devuelve la primera expresión.

Sintaxis

La sintaxis es así:

NULLIF ( expression , expression )

Ejemplo

Aquí hay un ejemplo para demostrarlo:

SELECT NULLIF(3, 3);

Resultado:

NULL

Aquí, ambas expresiones son iguales, por lo que el resultado es un valor nulo.

Esto es lo que sucede cuando las expresiones no son iguales:

SELECT NULLIF(3, 7);

Resultado:

3

Esta vez se devuelve el primer valor.

Aquí hay un ejemplo que resume ambos resultados:

SELECT 
    NULLIF(0, 0) AS a,
    NULLIF(3, 3) AS b,
    NULLIF(3, 0) AS c,
    NULLIF(0, 3) AS d;

Resultado:

+------+------+-----+-----+
| a    | b    | c   | d   |
|------+------+-----+-----|
| NULL | NULL | 3   | 0   |
+------+------+-----+-----+

Un ejemplo práctico

Supongamos que tenemos una tabla con los siguientes datos:

SELECT 
    ProductName,
    ProductPrice
FROM Products;

Resultado:

+-------------------------------------+----------------+
| ProductName                         | ProductPrice   |
|-------------------------------------+----------------|
| Left handed screwdriver             | 25.99          |
| Long Weight (blue)                  | 14.75          |
| Long Weight (green)                 | 11.99          |
| Smash 2000 Sledgehammer             | 0.00           |
| Chainsaw (includes 3 spare fingers) | 0.00           |
| Straw Dog Box                       | NULL           |
| Bottomless Coffee Mugs (4 Pack)     | 9.99           |
| Right handed screwdriver            | 25.99          |
+-------------------------------------+----------------+
(8 rows affected)

Y supongamos que queremos averiguar cuántos productos tienen un precio positivo. En otras palabras, no queremos incluir productos que tengan un precio o un valor cero o nulo.

Para hacer esto, podemos usar NULLIF() junto con COUNT() función:

SELECT 
    COUNT(NULLIF(ProductPrice, 0.00)) AS Result
FROM Products;

Resultado:

+----------+
| Result   |
|----------|
| 5        |
+----------+
Warning: Null value is eliminated by an aggregate or other SET operation.

Obtenemos 5 como se esperaba, que es exactamente cuántas filas tienen un valor positivo en ProductPrice columna.

Esto funciona porque COUNT() La función solo cuenta valores no nulos. Al convertir las cantidades cero en nulas, podemos ignorar esos valores en nuestro cálculo.

Aquí está de nuevo sin el NULLIF() función.

SELECT COUNT(ProductPrice) AS Result
FROM Products;

Resultado:

+----------+
| Result   |
|----------|
| 7        |
+----------+
Warning: Null value is eliminated by an aggregate or other SET operation.

Esta vez incluye las cantidades cero y obtenemos 7. Todavía ignora la fila 6 porque en realidad tiene un valor nulo.

Cuando el primer argumento es la constante nula

La función no acepta la constante nula como primer argumento:

SELECT NULLIF(null, 3);

Resultado:

Msg 4151, Level 16, State 1, Line 1
The type of the first argument to NULLIF cannot be the NULL constant because the type of the first argument has to be known.

Como indica el mensaje de error, se debe conocer el tipo del primer argumento. El valor de retorno de la función usa el tipo de datos de la primera expresión, y este error lo refleja.

Este error debería ser bastante raro. En la mayoría de los casos, pasará un nombre de columna como primer argumento y, en SQL Server, las columnas tienen un tipo de datos definido. En tales casos, se aceptará un valor nulo debido al hecho de que SQL Server conoce el tipo de datos de la columna.

Lo mismo podría decirse de las variables. Si pasa una variable, habría tenido que declarar su tipo y, por lo tanto, no obtendría el error.

Recuento de argumentos no válidos

Llamar a la función sin pasar ningún argumento da como resultado un error:

SELECT NULLIF();

Resultado:

Msg 102, Level 15, State 1, Line 1
Incorrect syntax near ')'.

Y pasar demasiados argumentos también provoca un error:

SELECT NULLIF(1, 2, 3);

Resultado:

Msg 102, Level 15, State 1, Line 1
Incorrect syntax near ','.