Vamos a hablar de otra función para trabajar con el misterioso NULL — NULLIF(). Te va a ayudar en situaciones donde necesitas reemplazar ciertos valores por NULL para manejar los datos correctamente. ¡Abróchate el cinturón, que esto va a estar interesante!
La función NULLIF() es una herramienta genial en PostgreSQL que te permite comparar dos valores y devolver NULL si son iguales, o devolver el primer valor si son diferentes. Es como si dijera: "¡Si estos valores son iguales, los ignoramos!"
Aquí tienes la sintaxis básica de la función:
NULLIF(value1, value2)
Si value1 y value2 son iguales, el resultado será NULL. Si son diferentes, el resultado será value1.
Ejemplo:
SELECT NULLIF(10, 10); -- Resultado: NULL
SELECT NULLIF(10, 20); -- Resultado: 10
SELECT NULLIF('hola', 'hola'); -- Resultado: NULL
SELECT NULLIF('hola', 'mundo'); -- Resultado: 'hola'
Fácil, ¿verdad? Ahora vamos a ver cómo usar esta función en problemas reales.
Ejemplo 1: Evitar división por cero
Dividir por cero es la pesadilla de cualquier programador. En SQL, si intentas dividir por cero, te dará un error. Aquí es donde NULLIF() nos salva.
Imagina que tienes una tabla sales con dos columnas: revenue (ingresos) y expenses (gastos). Queremos calcular la rentabilidad de los gastos (revenue / expenses), pero a veces los gastos son cero. Si hacemos la consulta sin comprobar nada, nos dará un error de división por cero.
Tabla sales:
| revenue | expenses |
|---|---|
| 1000 | 200 |
| 1500 | 0 |
| 2000 | 250 |
Consulta errónea:
SELECT revenue / expenses AS profitability
FROM sales;
-- Error: división por cero!
Solución con NULLIF():
SELECT revenue / NULLIF(expenses, 0) AS profitability
FROM sales;
Resultado:
| profitability |
|---|
| 5.00 |
| NULL |
| 8.00 |
Ahora, si expenses es 0, NULLIF(expenses, 0) devuelve NULL, y dividir por NULL no da error, simplemente devuelve NULL.
Ejemplo 2: Reemplazar valores iguales por NULL
Imagina que tienes una tabla con datos de estudiantes, con las columnas first_name y preferred_name. A veces los estudiantes prefieren su nombre real, y a veces eligen otro. Si ambos nombres son iguales, no tiene sentido mostrar preferred_name.
Tabla students:
| first_name | preferred_name |
|---|---|
| John | Johnny |
| Anna | Anna |
| Alex | Lex |
Consulta con NULLIF():
SELECT first_name,
NULLIF(preferred_name, first_name) AS display_name
FROM students;
Resultado:
| first_name | display_name |
|---|---|
| John | Johnny |
| Anna | NULL |
| Alex | Lex |
Cuando preferred_name y first_name son iguales, el resultado será NULL.
Ejemplo 3: Filtrar datos
A veces necesitas seleccionar solo las filas donde los valores en dos columnas son diferentes. Por ejemplo, tenemos una tabla de pedidos con original_price y discounted_price. Queremos encontrar los pedidos donde se aplicó un descuento.
Tabla orders:
| order_id | original_price | discounted_price |
|---|---|---|
| 1 | 100 | 100 |
| 2 | 200 | 180 |
| 3 | 150 | 150 |
Consulta con NULLIF():
SELECT order_id, original_price, discounted_price
FROM orders
WHERE NULLIF(original_price, discounted_price) IS NOT NULL;
Resultado:
| order_id | original_price | discounted_price |
|---|---|---|
| 2 | 200 | 180 |
Solo los pedidos con descuento aparecen en el resultado.
Casos prácticos de uso de NULLIF()
Caso 1: Elegir un valor opcional
Cuando trabajas con datos, a veces necesitas elegir un valor de varias columnas, excluyendo los que son iguales a cierto valor. Por ejemplo, tenemos una lista de empleados con sus salarios: base_salary y bonus. Si el bonus es 0, queremos ponerlo en 999.
Tabla employees:
| employee_id | base_salary | bonus |
|---|---|---|
| 1 | 50000 | 10000 |
| 2 | 40000 | 0 |
| 3 | 60000 | 5000 |
Consulta con NULLIF():
SELECT employee_id,
base_salary + COALESCE(NULLIF(bonus, 0), 999) AS total_salary
FROM employees;
Resultado:
| employee_id | total_salary |
|---|---|
| 1 | 60000 |
| 2 | 40999 |
| 3 | 65000 |
Si bonus es 0, se convierte en 999.
Caso 2: Contar filas
Podemos usar NULLIF() para simplificar condiciones de filtrado complicadas. Por ejemplo, tenemos una tabla de usuarios y queremos saber en una sola consulta tanto el número total como el número de usuarios registrados (sin el estado guest).
SELECT
COUNT(*) AS total_users,
COUNT(NULLIF(status, 'guest')) AS registered_users
FROM users;
Así, con solo una función NULLIF() podemos resolver un montón de tareas: desde evitar errores hasta mejorar la legibilidad del código. Ahora que sabes cómo funciona, ya estás un paso más cerca de ser un crack manejando datos en PostgreSQL.
GO TO FULL VERSION