¿Cuáles son las funciones avanzadas más comunes para el manejo de valores nulos y comparaciones en bases de datos?
Manipular valores nulos y realizar comparaciones precisas en bases de datos son habilidades esenciales para cualquier analista de datos o desarrollador de software. Algunas funciones avanzadas disponibles nos facilitan este tipo de operaciones, permitiéndonos optimizar nuestras consultas y obtener resultados más significativos de nuestros datos.
¿Cómo se utiliza 'Cuáles' para manejar valores nulos?
La función cuáles es particularmente útil cuando quieres verificar entre dos valores cuál de ellos no es nulo y retornar ese valor. Esto es vital cuando trabajamos con datos incompletos, y deseamos asegurar que siempre estamos trabajando con los valores más relevantes disponibles.
Por ejemplo, si estás manejando una lista de pasajeros y uno de los nombres es nulo, puedes modificar ese nombre de la base de datos para que retorne un valor diferente, como "no aplica", en lugar de simplemente mostrar un valor nulo. Esto sería especialmente útil para mantener el flujo de información sin interrupciones y prevenir errores de datos.
SELECTCOALESCE(nombre,'no aplica')AS nombre_modificado FROM pasajeros;
¿Qué es y cómo funciona NullIF?
NullIF es otra función poderosa que permite comparar dos valores y retorna NULL si ambos valores son iguales, de lo contrario, retorna el primer valor. Este comportamiento es muy útil para prevenir operaciones prohibidas como divisiones por cero al asegurar que los resultados previos sean válidos.
SELECTNULLIF(valor1, valor2)FROM tabla;
¿Cómo seleccionar los valores máximos o mínimos usando Greatest y Least?
Cuando trabajas con una lista de datos, como un arreglo numérico, y necesitas determinar el valor más alto o el más bajo, Greatest y Least son funciones a las que siempre puedes recurrir.
Greatest toma un arreglo de valores y te devuelve el mayor de ellos.
Least hace lo contrario devolviendo el menor.
Supongamos que tienes un arreglo de números y deseas encontrar el máximo y el mínimo.
¿Qué son los bloques anónimos y cómo se conectan con consultas avanzadas?
Los bloques anónimos permiten la implementación de lógicas complejas dentro de las consultas SQL, ofreciendo casi la misma flexibilidad que los lenguajes de programación como PHP o Python. Esto incluye el uso de condicionales para realizar evaluaciones complejas antes de insertar o manipular datos.
Por ejemplo, supongamos que necesitas agregar una columna que determine si un pasajero es niño o adulto según su fecha de nacimiento. Con un bloque condicional podrías lograrlo como sigue:
DO $$
BEGINCASEWHEN fecha_nacimiento >'2015-01-01'THENRETURN'niño';ELSERETURN'adulto';ENDCASE;END $$;
¿Cómo se pueden combinar consultas para mayor funcionalidad?
Finalmente, combina consultas y agrega información adicional. Por ejemplo, podrías querer filtrar pasajeros cuyos nombres comiencen por ciertas letras y que sean mayores de 18 años. Este enfoque no solo asegura que tu base de datos mantiene su integridad, pero también se enriquece con información relevante de manera continua.
Anímate a poner en práctica estas funciones avanzadas y comparte tus resultados, esto no solo fortalecerá tu habilidad, pero también contribuirá al crecimiento del conocimiento colectivo.
Funciones Especiales avanzadas en PosgreSQL
• COALES: compara dos valores y retorna el que es nulo
• NULLIF: Retorna null si son iguales
• GREATEST: Compara un arreglo y retorna el mayor
• LEAST: Compara un arreglo de valores y retorna el menor
• BLOQUES ANONIMOS: Ingresa condicionales dentro de una consulta de BD
Hola mas bien el COALESCE retorna el primer elemento que NO es nulo, dentro de todos los parametros que le pasas.
SELECT id, nombre, fecha_nacimiento,CASEWHEN nombre ILIKE'a%'THEN'Comienza con A'WHEN nombre ILIKE'e%'THEN'Comienza con E'WHEN nombre ILIKE'i%'THEN'Comienza con I'WHEN( current_date - fecha_nacimiento)>6570Then'Es mayor de 18 años'ELSE'Su nombre no inicia con A, E o I y ademas es un niño'ENDFROM pasajero ORDERBY fecha_nacimiento;```
por que para ser mayor debe ser mayor a 6570? por que ese numero?
ah ok, son los dias para ser mayor
lo hice simple pero funciono.
Buen aporte el alias.
Gracias. Me ayudó de referencia, mi código andaba valiendo madres por una coma jaja
Buena explicacion, este es el codigo del video
SELECT*FROM pasajero WHERE id =5;UPDATE pasajero SET nombre =NULLWHERE id =5SELECTCOALESCE(nombre,'Nombre en Null')AS nombrenull ,*FROM pasajero WHERE id =5;SELECTNULLIF(0,0);SELECTNULLIF(0,1);SELECTGREATEST(5,5,8,95,75,4225,8,6,9,212,6);SELECTLEAST(5,5,8,95,75,4225,8,6,9,212,6);--RetoSELECTCOALESCE(nombre,'Nombre en Null')AS nombrenull ,*,CASEWHEN fecha_nacimiento >'2015-01-01'THEN'Niño'ELSE'Mayor'END,CASEWHEN nombre ILIKE'D%'THEN'Empieza con D'ELSE'No empieza con D'END,CaseWHENextract(years fromage(current_timestamp,fecha_nacimiento::timestamp))>=18THEN'Mayor de edad.'ELSE'Menor de edad.'ENDFROM pasajero;
buena
Funciones Especiales Avanzadas
COALESCE
NULLIF
GREATEST
LEAST
BLOQUES ANONIMOS
--Si el nombre es null, entonces me mostra 'No Aplica'SELECT id,COALESCE(nombre,'No Aplica')AS nombre, direccion_residencia FROMpublic.pasajeroWHERE id =1;--Si dos campos son iguales --->0:FalseSELECTNULLIF(0,1);--Devuelve el mayor
SELECTGREATEST(0,1,2,5,2,3,6,10,2,1,20);--Devuelve en menor
SELECTLEAST(0,1,2,5,2,3,6,10,2,1,20);--Devuelve si es Niño o MayorSELECT id, nombre, direccion_residencia, fecha_nacimiento,(CASEWHEN(fecha_nacimiento)>'2015-01-01'THEN'Niño'ELSE'Mayor'END)FROMpublic.pasajero;--RetoSELECT id, nombre, direccion_residencia, fecha_nacimiento,(CASEWHEN(CURRENT_DATE- fecha_nacimiento)/365>=18THEN'>Mayor'ELSE'<Menor'END)FROMpublic.pasajero;
Reto:
SELECT id
,nombre
,CASEWHEN nombre ILIKE'A%'THEN'A'WHEN nombre ILIKE'E%'THEN'E'WHEN nombre ILIKE'I%'THEN'I'WHEN nombre ILIKE'O%'THEN'O'WHEN nombre ILIKE'U%'THEN'U'ELSE'OTRA'ENDAS comienzo
,fecha_nacimiento
,DATE_PART('year',current_date)-DATE_PART('year',fecha_nacimiento)as edad
,CASEWHENDATE_PART('year',current_date)-DATE_PART('year',fecha_nacimiento)>=18THEN'MAYOR'ELSE'MENOR'ENDAS mayores
FROM pasajeros;
Me gustó que le cambiaras el nombre a la columna del case a ´comienzo´
Genial este aporte. No sabía cómo cambiar el nombre a la columna CASE.
Esta es mi solución al ejercicio:
SELECT id, nombre, direccion_red, fecha_nac,CASEWHEN fecha_nac >=(CURRENT_DATE-INTERVAL'18 years')THEN'menor de edad'Else'mayor de edad'ENDFROMpublic.pasajeroWHERE nombre ILIKE'a%';```
Practica solicitada en el vídeo:
SELECT
id, nombre, direccion_residencia, fecha_nacimiento,
CASE WHEN (date_part('year',current_date) - date_part('year',fecha_nacimiento)) >= 18 THEN
'Mayor de Edad'
ELSE
'Menor de Edad'
END as Tipo,
CASE WHEN upper(nombre) LIKE 'O%' THEN
'Inicia con O'
ELSE
'No inicia con O'
END as Inicio_O
FROM public.pasajero;
Las funciones aprendidas en la clase anterior y las funciones avanzadas de esta clase pertenecen al lenguaje "SQL" o son propias del servicio "PL/PgSQL"?
Hola, las de la clase anterior y esta son propias de PostgreSQL
YO REALICE UNA CONSULTA PARECIDA AL DEL PROFE SOLO QUE TAMBIÉN MOSTRÉ SU EDAD EN AÑOS Y MESES
AQUÍ LES DEJO LA CONSULTA
¿Habrá forma de optimizar este script?
SELECT id, nombre, fecha_nacimiento,CASEWHEN(current_date - fecha_nacimiento)>3574.5THEN'Mayor de edad'ELSE'Menor de edad'ENDAS"Edad",CASEWHEN nombre ILIKE'b%'THEN'Consonante'WHEN nombre ILIKE'c%'THEN'Consonante'WHEN nombre ILIKE'd%'THEN'Consonante'WHEN nombre ILIKE'f%'THEN'Consonante'WHEN nombre ILIKE'g%'THEN'Consonante'WHEN nombre ILIKE'h%'THEN'Consonante'WHEN nombre ILIKE'j%'THEN'Consonante'WHEN nombre ILIKE'k%'THEN'Consonante'WHEN nombre ILIKE'l%'THEN'Consonante'WHEN nombre ILIKE'a%'THEN'Vocal'WHEN nombre ILIKE'e%'THEN'Vocal'WHEN nombre ILIKE'i%'THEN'Vocal'WHEN nombre ILIKE'o%'THEN'Vocal'WHEN nombre ILIKE'u%'THEN'Vocal'ELSE'Consonante no incluida'ENDAS"InicioNombre"FROMpublic.pasajeros
Postgres ahora permite hacer ILIKE con un array:
...ILIKEANY(array['a%','e%','i%','o%', ue%']) THEN 'Vocal' ...
Funciones Avanzadas en PostgreSQL
COALESCE: Compara entre dos valores para ver cual es NULL y retorna el que NO lo sea
SELECT user_id, COALESCE(user_name, 'No Aplica') FROM public.usuarios;
Retorna todos los usuarios cuyo nombre no sea NULL
NULLIF: Retorna null si ambos valores son iguales
SELECT NULLIF(10,10) ⇒ Null
GREATEST: Compara un arreglo y retorna el mayor
LEAST: Compara un arreglo de valores y retorna el meno
Bloques Anónimos: Estos son condicionales como los de cualquier lenguaje de programación pero con una sintaxis distinta
SELECT * FROM users
CASE
WHEN user_age > 18 THEN
‘Mayor de edad’
ELSE
‘Menor de edad’
END
Comparto mi código y solución al reto :)
SELECT full_name, dni, birth_date,
CASE
WHEN full_name ilike 'a%' then
'Empieza con A'
ELSE
'No empieza con A'
END,
CASE
WHEN birth_date>'25-01-2004' then
'Menor de edad'
ELSE
'Mayor de edad'
END
from passengers;
Para que el nombre de la columna no salga case, al final escriben:
END AS column_name
--Reto listar cuáles pasajero sus nombres comienzan con la letra 'o' y cuáles de ellos tiene más de 18 años
SELECT id, nombre, direccion_residencia, fecha_nacimiento,CASEWHEN nombre ILIKE'o%'THEN'Si Aplica'ELSE'No Aplica'ENDASComienza_con_O,EXTRACT(year FROMage(current_date,fecha_nacimiento))AS edad
FROMpublic.pasajeroWHEREEXTRACT(year FROMage(current_date,fecha_nacimiento))>=18AND nombre ILIKE'o%';
select id, nombre, direccion_residencia, fecha_nacimiento,case when nombre ILIKE'd%' then
'SI'else'NO' end asLetra_Inicial_D,case when extract(years fromage(current_timestamp,fecha_nacimiento::timestamp))>=18 then
'mayor'else'menor' end asEdadfrompublic.pasajero;```
Gracias por esta clase!!!
ERROR: error de sintaxis en o cerca de «CASE»
LINE 2: CASE
que mas muestra podrias compartir tu codigo? . Pero creo que puede ser que antes de iniciar un bloque anonimo ocupa una coma quedando ', CASE'
Te comparto mi codigo de la tarea por si te sirve si aun no tienes solucion comparte tu codigo seria de mayor ayuda para saber cual es el contexto del sintaxis.
SELECT id, nombre, direccion_residencia, fecha_nacimiento,CASEWHEN nombre ILIKE'o%'THENnombre
ENDASINICIAL_nombre,CASEWHEN fecha_nacimiento>'2005-01-01'THEN'menor de edad'ELSE'mayor de edad'ENDFROMpublic.pasajerosWHERE(nombre ILIKE'o%');
Creo que llegué un poco tarde pero me estaba apareciendo el mismo error que a ti, estuve buscando un poco en google y me di cuenta que el fallo estaba en que me faltaba una coma despues de fecha_nacimiento. Te dejo la query con el error y la query corregida para que veas la pequeña diferencia.