No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Adquiere por un año todos los cursos, escuelas y certificados por un precio especial.

Antes: $249

Currency
$219/año

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Comprar ahora

Termina en:

0D
15H
15M
50S
Curso de PostgreSQL

Curso de PostgreSQL

Oswaldo Rodríguez González

Oswaldo Rodríguez González

Funciones Especiales Avanzadas

20/32
Recursos

Aportes 292

Preguntas 12

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

o inicia sesión.

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

Mi aporte

SELECT id, nombre, fecha_nacimiento,
	CASE
	WHEN 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) > 6570 Then 'Es mayor de 18 años'
	ELSE 'Su nombre no inicia con A, E o I y ademas es un niño'
	END
FROM pasajero ORDER BY fecha_nacimiento;```

lo hice simple pero funciono.

Estas son las funciones avanzadas más comunes en postgres.

  • COALESCE: te permite comparar 2 valores y retornar el que no es nulo. Pero la función acepta un número ilimitado de argumentos. Cuando son más de 2 argumentos devuelve el primero no NULL (en sentido de izquierda a derecha). Si todos los argumentos son NULL, devuelve NULL.
    Se utiliza para evitar devolver valores nulos. Esto es útil cuando el valor devuelto tiene que ser usado dentro de una función. Para que esta función no tenga un argumento nulo.
    https://www.postgresqltutorial.com/postgresql-coalesce/
  • NULLIF: te permite comparar 2 valores y retorna NULL si son iguales. Si no son iguales retorna el argumento de la izquierda. Esta función se puede usar como denominador de una división con el argumento de la izquierda igual a cero. La división siempre se dividirá por el argumento de la izquierda salvo cuando sea cero. Para ese caso NULLIF devuelve NULL, haciendo que el resultado de la división sea NULL y no indefinido.
    https://www.postgresqltutorial.com/postgresql-nullif/
  • GREATEST: te permite comparar un arreglo de valores y te retorna el mayor
  • LEAST: idem anterior pero para este caso retorna el menor
  • BLOQUES ANÓNIMOS: al igual que el desarrollo de software te permite ingresar condicionales pero dentro de una consulta de base de datos. Se agrega más información a una misma tabla sin agregar ningún tipo de consulta

Buena explicacion, este es el codigo del video

SELECT * FROM pasajero WHERE id = 5;
UPDATE pasajero SET nombre = NULL WHERE id = 5
SELECT COALESCE(nombre, 'Nombre en Null') AS nombrenull , * FROM pasajero WHERE id = 5;
SELECT NULLIF(0,0);
SELECT NULLIF(0,1);
SELECT GREATEST(5,5,8,95,75,4225,8,6,9,212,6);
SELECT LEAST(5,5,8,95,75,4225,8,6,9,212,6);
-- Reto
SELECT COALESCE(nombre, 'Nombre en Null') AS nombrenull , *,
CASE WHEN fecha_nacimiento > '2015-01-01' THEN
'Niño' ELSE 'Mayor' END,
CASE WHEN nombre ILIKE 'D%' THEN
'Empieza con D' ELSE 'No empieza con D' END, 
Case WHEN extract(years from age(current_timestamp,fecha_nacimiento::timestamp)) >= 18 THEN
'Mayor de edad.' ELSE 'Menor de edad.' END
FROM pasajero;

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 FROM public.pasajero
WHERE id = 1;

-- Si dos campos son iguales ---> 0: False
SELECT NULLIF(0,1);

-- Devuelve el mayor
SELECT GREATEST(0,1,2,5,2,3,6,10,2,1,20);

-- Devuelve en menor
SELECT LEAST(0,1,2,5,2,3,6,10,2,1,20);

-- Devuelve si es Niño o Mayor
SELECT id, nombre, direccion_residencia, fecha_nacimiento,
    (CASE
    WHEN (fecha_nacimiento) > '2015-01-01' THEN
        'Niño'
    ELSE
        'Mayor'
    END)
FROM public.pasajero;

-- Reto
SELECT id, nombre, direccion_residencia, fecha_nacimiento,
    (CASE
    WHEN (CURRENT_DATE - fecha_nacimiento)/365 >= 18 THEN
        '>Mayor'
    ELSE
        '<Menor'
    END)
FROM public.pasajero;

Reto:

SELECT
	id
	,nombre
	,CASE
		WHEN 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'
	END AS comienzo
	,fecha_nacimiento
	,DATE_PART('year',current_date)-DATE_PART('year',fecha_nacimiento) as edad
	,CASE 
		WHEN DATE_PART('year',current_date)-DATE_PART('year',fecha_nacimiento)  >= 18 THEN 'MAYOR'
		ELSE 'MENOR'
	END AS mayores
FROM pasajeros;

Esta es mi solución al ejercicio:

SELECT id, nombre, direccion_red, fecha_nac,
CASE
WHEN fecha_nac >= (CURRENT_DATE - INTERVAL '18 years') THEN 
'menor de edad'
Else
'mayor de edad'
END
	FROM public.pasajero
	WHERE 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;

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

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, 
	CASE
		WHEN  nombre ILIKE 'o%'  THEN
			'Si Aplica'
		ELSE
			'No Aplica'
	END AS Comienza_con_O,
	EXTRACT(year FROM age(current_date,fecha_nacimiento)) AS edad
	
FROM public.pasajero
WHERE  EXTRACT(year FROM age(current_date,fecha_nacimiento)) >=18 AND nombre ILIKE 'o%' ;
select id, nombre, direccion_residencia, fecha_nacimiento,
case when nombre ILIKE 'd%' then
'SI' else 'NO' end as Letra_Inicial_D,
case when extract(years from age(current_timestamp, fecha_nacimiento::timestamp)) >= 18 then
'mayor' else 'menor' end as Edad
from public.pasajero;```

Gracias por esta clase!!!

En el script realizado se puede identificar diferentes iniciales y si la persona es o no mayor de edad.

Esta es mi solución al reto:

SELECT id, nombre, direccion_residencia, fecha_nacimiento,
CASE 
WHEN nombre ILIKE ('o%') THEN
'Inicia con O'
ELSE
'Inicia con otra letra'
END AS nombres_por_O,
CASE 
WHEN age(current_date, fecha_nacimiento) > '18 years' THEN
'Mayor de edad'
ELSE
'Menor de edad'
END AS mayoria_edad
	FROM public.pasajeros;

La función age() te devuelve los años, meses y días que tiene la persona respecto al primer valor fecha que introduces.

Check this 😃

SELECT
    nombre,
    fecha_nacimiento,
    CASE
        WHEN (
            current_date - fecha_nacimiento) > 0
            THEN (current_date - fecha_nacimiento) / 365
    END AS EDAD -- para calcular la edad e imprimir la columna edad,
    CASE
        WHEN (
            current_date - fecha_nacimiento)/365 >= 30
            THEN ' >= 30'
        ELSE '< 30'
    END AS VALIDACION -- este hace la validación entre aquellos que efectivamente tengan 30 años o sean menores de esta edad.
FROM public.pasajero
WHERE nombre ILIKE 's%'; -- que me muestre solamente los pasajeros que inician con la letra 'S'
SELECT 	*,
		CASE 
		WHEN nombre ILIKE 'o%'
		THEN 'SI'
		ELSE 'NO'
		END AS Comienza_con_O,
		
		CASE 
		WHEN (
			SELECT CAST(CONCAT(birth_year+18,'-',birth_month,'-',birth_day) AS date)
			FROM (
				SELECT 	EXTRACT(YEAR FROM fecha_nacimiento) AS birth_year,
						EXTRACT(MONTH FROM fecha_nacimiento) AS birth_month,
						EXTRACT(DAY FROM fecha_nacimiento) AS birth_day
			) AS DIF
		) < current_date
		THEN 'SI'
		ELSE 'NO'
		END AS MAYOR_EDAD
FROM pasajero;
SELECT *, 
	   CASE WHEN nombre ILIKE 'o%' THEN TRUE 
	   ELSE FALSE 
	   END AS starts_with_o,
	   CASE WHEN DATE_PART('YEAR', AGE(fecha_nacimiento)) >= 18 THEN TRUE
	   ELSE FALSE
	   END AS is_adult
FROM pasajero

Puede anidar unos CASE dentro de otros en el ELSE. Es hermoso :’)

SELECT id, name,
CASE
WHEN name ILIKE 'o%' 
	THEN 'True'
	ELSE 'False'
END AS start_with_an_O,
CASE
	WHEN EXTRACT(YEAR FROM current_date) - EXTRACT(YEAR FROM birthday) < 30
		THEN 'Menor de edad.'
		ELSE 'Mayor de edad.'
END AS older_age
FROM public.passenger
ORDER BY start_with_an_o DESC;

Gracias por la clase, es genial!

![](

SELECT id, nombre, direccion, fecha_nacimiento,
CASE
WHEN nombre ILIKE ‘o%’ THEN
’Inicia con O’
ELSE
’Inicia con otra letra’
END AS Inicial,
CASE
WHEN ((CURRENT_DATE-fecha_nacimiento)/365) >= 18 THEN
’Mayor’
ELSE
’Menor’
END AS Edad
FROM pasajero;

SELECT id_pasajero, nombre , direccion_residencia, fecha_nacimiento,
CASE 
	WHEN nombre ILIKE('D%')  THEN
	'SI'
	ELSE
	'NO'
END AS NOMBRE_EMP_D,
CASE
	WHEN EXTRACT(YEAR FROM current_date)- EXTRACT(YEAR FROM fecha_nacimiento)<18 THEN
	'MENOR DE EDAD'
	ELSE
	'MAYOR DE EDAD'
END 
FROM public.pasajeros;```
<SELECT 
id, 
nombre, 
domicilio, 
fecha_nacimiento,
CASE WHEN fecha_nacimiento > '2002-08-31' THEN
'Mayor de edad'
else 
'Menor de edad'
end as edad
FROM public.pasajeros
where nombre ilike 'a%'
and (CASE WHEN fecha_nacimiento < '2022-08-31' THEN
'Mayor de edad'
else 
'Menor de edad'
end) like 'Mayor%'

;> 
<SELECT id, nombre, direccion_residencia, fecha_nacimiento, 
    CASE 
        WHEN fecha_nacimiento < '2006-01-01' AND (nombre ILIKE 'a%' OR nombre ILIKE 'e%' OR nombre ILIKE 'i%' OR nombre ILIKE 'o%' OR nombre ILIKE 'u%') THEN
            'su nombre inicia con vocal y es mayor de edad'
        WHEN fecha_nacimiento >= '2006-01-01' AND (nombre ILIKE 'a%' OR nombre ILIKE 'e%' OR nombre ILIKE 'i%' OR nombre ILIKE 'o%' OR nombre ILIKE 'u%') THEN
            'su nombre inicia con vocal pero es menor de edad'
        WHEN fecha_nacimiento < '2006-01-01' THEN
            'su nombre no inicia con vocal y es mayor de edad'
        ELSE 
            'su nombre no inicia con vocal y es un menor de edad'
    END
FROM public.pasajero;> 

Para hacer el ejercicio de bloques anónimos (toda la vida les llamé condicionales) mas lógico para mi, acorde al ejemplo:

select * , 
case when fecha_nacimiento >= '2011-01-01' then 'Infante' 
when fecha_nacimiento <= '1960-01-01' then 'Adulto mayor'
else 'Sin descuento' end tarifa 
from pasajero 
where fecha_nacimiento > '2011-01-01'
SELECT nombre, CASE 
WHEN (date_part('year', current_date) - date_part('year',fecha_nacimiento)) >=18 THEN
'Mayor de Edad' ELSE 'Menor de Edad'
END AS Condicion,
CASE 
WHEN nombre ILIKE 'C%' THEN 'Cumple' ELSE 'No Cumple' END AS Letra_inicial_C
FROM pasajero;
SELECT id, nombre, direccion_residencia, fecha_nacimiento,
    CASE WHEN fecha_nacimiento > '2005-08-12' THEN 'Menor 18'
         ELSE 'Mayor 18'
    END AS edad
FROM public.pasajero;

SELECT nombre, 
    CASE WHEN fecha_nacimiento > '2005-08-12' THEN 'Menor 18'
         ELSE 'Mayor 18'
    END AS edad
FROM public.pasajero
WHERE nombre ILIKE 'o%';

Prueba de queries

Mi aporte

SELECT "ID", "Nombre", "Dirección_Residencia", "Fecha",
	CASE
		WHEN "Nombre" LIKE 'A%' THEN 'Inicia_con_A'
		WHEN "Nombre" LIKE 'J%' THEN 'Inicia_con_J'
		WHEN current_date > '2015-01-01' THEN 'Adulto'
		ELSE 'Niño e inicia con vocal'
	END 
FROM public."pasajero";

En la nueva versión de pgAdmin 4, me funcionó este query para el último ejercicio:

SELECT
    id_pasajero,
    nombre_pasajero,
    direccion_residencia,
    fecha_nacimiento,
    CASE
        WHEN fecha_nacimiento > '2015-01-01' THEN 'Niño'
        ELSE 'Mayor'
    END AS categoria
FROM
    public.pasajeros;

Por si a alguien se topa con algún error en la sintaxis cerca de WHEN.

SELECT id, nombre, direccion_residencia, fecha_nacimiento,
CASE
WHEN fecha_nacimiento > '2005-01-01' THEN
'Menor'
ELSE
'Mayor'
END,
CASE
WHEN nombre ILIKE 'p%' THEN
'nombre empieza por P'
ELSE 
'no'
END
FROM public.pasajero;

Mi aporte al reto

SELECT *
	FROM public.passenger
	WHERE name ILIKE 'l%';
	
SELECT *,
CASE
WHEN name ILIKE 'l%' THEN 
	CASE
	WHEN (current_date - birthdate) > 6570 THEN
	'You are 18 years old and your name begins with L'
	ELSE
	'Your name starts with L and you are a boy'
	END
ELSE 
	CASE
	WHEN (current_date - birthdate) > 6570 THEN
	'You are 18 years old and your name does not start with L'
	ELSE
	'You are a boy and your name does not start with L'
	END
END as consulta
	FROM public.passenger ORDER BY birthdate;

Clase 20: Funciones Especiales Avanzadas

  • COALESCE: Permite comparar entre dos valores y retornar cual de los dos no es nulo.
  • NULLIF: Permite comparar dos valores y retorna NULL si son iguales.
  • GREATEST: Permite comparar un arreglo de valores y retorna el mayor
  • LEAST: Permite comparar un arreglo de valores y retorna el menor
  • BLOQUES ANÓNIMOS al igual que el desarrollo de software nos permite ingresar condicionales pero dentro de una consulta de base de datos.

–RETO

SELECT id, nombre,direccion_residencia,fecha_nacimiento ,
CASE  
 	when (nombre ilike 'a%')  then 'Comiensa con a'   
	 when nombre ilike 'e%' then 'Comiensa con e'
	 when nombre ilike 'i%' then 'Comiensa con i'
	 when nombre ilike 'o%' then 'Comiensa con o'
	 when nombre ilike 'u%' then 'Comiensa con u'
else
   'No - a,e,i,o,u'
   end  inicia_vocal   ,
   case  
   when (current_date-fecha_nacimiento) >18  
      then '>18' else '<18'
	  end edad_18   
FROM pasajero 


20. Funciones Especiales Avanzadas

Avanzadas

  • COALESCE
  • NULLIF
  • GREATEST
  • LEAST
  • BLOQUES ANÓNIMOS

🐄

SELECT id, nombre, fecha_nacimiento,
    CASE
        WHEN pasajeros.nombre ILIKE ANY (ARRAY['a%', 'w%', 'm%'])
            THEN 'es menor de edad y su nombre empieza con "a", "w" o "m"'
        ELSE 'menor de edad'
    END AS menores_de_edad
FROM transporte.pasajeros
WHERE pasajeros.fecha_nacimiento > '2005-01-01';

SELECT id nombre, fecha_nacimiento
CASE
WHEN fecha_nacimiento > ‘2015-01-01’ THEN
’Nino’
ELSE
‘Mayor’
END

FROM public.pasajero
WHERE nombre = ILIKE ‘o%’;

SELECT id, nombre, direccion_residencia, fecha_nacimiento,
CASE 
WHEN nombre LIKE 'O%' THEN 'EMPIEZA POR LA LETRA O'
ELSE 'Otra letra'
END AS letra,

CASE 
WHEN (current_date - fecha_nacimiento)/365 > 18 THEN 'Mayor de edad'
ELSE 'Menor de edad'
END as edad

from pasajero;

`

Les comparto mi codigo en base a los datos de mi tabla

SELECT id, nombre, direccion, fecha,
CASE 

WHEN Nombre ILIKE 'o%' THEN
'Comienza con o'
ELSE
'otra letra'
END AS LETRAS,

CASE 
WHEN fecha > '2022-01-01' THEN
'Es un beibi'
ELSE
'OTROS'
END AS EDAD
	FROM public.pasajero;

funciones especiales avanzadas:

COALESCE: comparar dos valores y retornar cuál de los dos no es Null
NULLIF: comparar dos valores y retorna NULL si son iguales
GREATEST: Regresa el valor mayor en el caso de LEAST retorna el menor
BLOQUES ANÓNIMOS: permite ingresar condicionales dentro de una consulta de datos.

Resumen de la clase

COALESCE

La función COALESCE en PostgreSQL devuelve el primer valor no nulo de una lista de expresiones. Por ejemplo:


SELECT COALESCE(null, 2, 3)

Esta consulta devuelve 2, ya que es el primer valor no nulo de la lista.

Más información: https://www.postgresql.org/docs/current/functions-conditional.html#FUNCTIONS-COALESCE

NULLIF

La función NULLIF en PostgreSQL devuelve nulo si dos expresiones son iguales, o la primera expresión si son diferentes. Por ejemplo:


SELECT NULLIF(2, 2);

Esta consulta devuelve nulo, ya que las expresiones son iguales.

Más información: https://www.postgresql.org/docs/current/functions-conditional.html#FUNCTIONS-NULLIF

GREATEST

La función GREATEST en PostgreSQL devuelve el valor máximo de una lista de expresiones. Por ejemplo:


SELECT GREATEST(1, 2, 3);

Esta consulta devuelve 3, ya que es el valor máximo de la lista.

Más información: https://www.postgresql.org/docs/current/functions-conditional.html#FUNCTIONS-GREATEST

LEAST

La función LEAST en PostgreSQL devuelve el valor mínimo de una lista de expresiones. Por ejemplo:


SELECT LEAST(1, 2, 3);

Esta consulta devuelve 1, ya que es el valor mínimo de la lista.

Más información: https://www.postgresql.org/docs/current/functions-conditional.html#FUNCTIONS-LEAST#

Consulta

SELECT id_pasajero, nombre, direccion, fecha_nacimiento,AGE(CURRENT_DATE, fecha_nacimiento) AS edad,
CASE
    WHEN fecha_nacimiento >= (CURRENT_DATE - INTERVAL '20' ) THEN 'menor de edad'
ELSE
'mayor de edad'
	END AS edad
FROM public.pasajeros
WHERE nombre like 'A%'

Salida

Mientras realizaba el ejercicio final me encontré con esta función que me pareció interesante:

Se puede calcular la edad de una persona en años utilizando la función age. La función age toma dos argumentos, la fecha actual y la fecha de nacimiento de la persona, y devuelve un intervalo que representa la diferencia entre ambas fechas.

Para calcular la edad de un pasajero en años, se puede utilizar la siguiente consulta

SELECT id_pasajero, nombre, direccion, fecha_nacimiento, age(current_date, fecha_nacimiento) as edad
FROM public.pasajeros;

Easy 🤗

SELECT id, nombre, direccion, fecha_nacimiento,
CASE
--inicia bloque anónimo
   WHEN nombre ILIKE 'm%' THEN '1'
   ELSE '0'
END as nombre_inicia_o,
--termina bloque anónimo
CASE
--inicia bloque anónimo
   WHEN EXTRACT(YEAR FROM current_date)- EXTRACT(YEAR FROM fecha_nacimiento) <= 18 THEN
   'Mayor de 18 años'
   ELSE
   'Menor de 18 años'
END as Mayoria_de_edad
--termina bloque anónimo
FROM public.pasajeros;

Solucion al reto, yo se q esto no cuenta los viciestos pero igual se defiende bastante bien la formula con casos de personas q ya cumplieron años este año o no

SELECT *,
CASE
WHEN nombre ILIKE 'o%' THEN
'Comienza con O'
WHEN nombre ILIKE 's%' THEN
'Comienza con S'
WHEN nombre ILIKE 'm%' THEN
'Comienza con M'
ELSE
'OTRO'
END,
CASE
WHEN (CURRENT_DATE - fecha_nacimiento) / 365 >= 18 THEN
'Mayor de edad'
ELSE
'Menor de edad'
END, (CURRENT_DATE - fecha_nacimiento) / 365 AS edad
FROM pasajeros;
SELECT id, nombre, direccion_residencia, fecha_nacimiento,
CASE
WHEN EXTRACT(year FROM fecha_nacimiento) - EXTRACT(year FROM CURRENT_TIMESTAMP) > 18 THEN
'Mayor'
ELSE
'Menor'
END,
CASE
WHEN nombre ILIKE 'o%' THEN
'startss with o'
ELSE
'dont starts with o'
END
FROM public.pasajeros;```
<code> 
select 
	id,
	nombre, 
	direccion_residencia,
	fecha_nace,
	(case
	 	when extract( years from AGE(CURRENT_DATE, fecha_nace) ) < 18  then
	 		'Niño'
	 	else 
	 		'Mayor'
	 	end
	) as es_mayor,
	(case
	 	when nombre ilike('c%') then
	 		'Comienzo por la C'
	 	else
	 		'No comienzo por la C'
	 	end
	) as comienza_por_c
	from  pasajero;
SELECT id, nombre, direccion_residencia, fecha_nacimiento,
CASE
WHEN nombre ILIKE 'm%' THEN
'Comienza por m'
END, CASE
WHEN fecha_nacimiento < '2005-01-01' THEN
'Mayor de edad'
ELSE
'Menor de edad'
END
	FROM public.pasajeros
	ORDER BY fecha_nacimiento ASC;

SELECT id, nombre,direccion,fecha,
CASE
WHEN nombre ILIKE ‘a%’ THEN
’Comienza con A’
WHEN nombre ILIKE ‘g%’ THEN
’Comienza con G’
WHEN nombre ILIKE ‘p%’ THEN
’Comienza con P’
END AS “Letra inicial”,
CASE
WHEN (CURRENT_DATE - fecha)>6570 THEN
’Es mayor a 18 años’
ELSE
’Es menor de edad’
END AS "Mayoria de edad"
FROM pasajero ORDER BY fecha;

Mi solucion, espero les ayude

select *,
case 
when nombre like 'a%' then
'Nombre empieza por a'
when nombre like 'c%' then 
'Nombre empieza por c'
else
'Nombre no empieza por a o c'
end as Nombres,
case
when fecha_nacimiento >'2023-01-01' then
'Niño'
else
'Mayor de 18 años'
end as Edades
from pasajero;

Mi resolución del ejercicio:

Se puede agregar mas “WHEN” con el operador logico “AND”, muy similar a como se hace en el lenguaje de programación “Pascal”

En el caso de “GREAST” y “LEAST” me dio mejor resultado con “MAX” y “MIN” respectivamente

SELECT id,
       nombre,
       fecha_nacimiento,
       direccion_residencia,
       EXTRACT( YEAR FROM age(now(), fecha_nacimiento)) AS edad,
       CASE
           WHEN EXTRACT( YEAR FROM age(now(), fecha_nacimiento)) < 18
              THEN 'Menor de edad'
           ELSE 'Mayor de edad'
           END
FROM pasajero
WHERE nombre LIKE 'P%';
-- Reto 
SELECT id, nombre, direccion_residencia, fecha_nacimiento,
CASE
WHEN DATE_PART('year',current_date) - DATE_PART('year',fecha_nacimiento) >= 18 THEN 'Adulto'
ELSE 'Niño'
END AS Categoria,
CASE
WHEN 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 'CONSONANTE'
END AS Comienza
FROM public."Pasajeros";

Funciones Especiales Avanzadas


COALESCE

COALESCE es una función especial en PostgreSQL que permite devolver el primer valor no NULL de una lista de expresiones. La función COALESCE es útil para manejar valores NULL en una consulta

SELECT COALESCE(column1, column2, column3)
FROM table_name;

En este ejemplo, la consulta devolverá el primer valor no NULL en la lista column1, column2, column3. Si column1 es NULL, se devolverá el valor en column2, y si column2 también es NULL, se devolverá el valor en column3. Si todas las columnas son NULL, la función COALESCE devolverá NULL.

NULLIF

NULLIF es una función especial en PostgreSQL que permite comparar dos expresiones y devolver NULL si son iguales, o el primer valor si son diferentes. La función NULLIF es útil para manejar valores iguales en una consulta.

SELECT NULLIF(column1, column2)
FROM table_name;

En este ejemplo, la consulta comparará el valor en column1 con el valor en column2. Si son iguales, la función NULLIF devolverá NULL, y si son diferentes, devolverá el valor en column1.

LEAST

LEAST es una función especial en PostgreSQL que permite devolver el menor valor de una lista de expresiones. La función LEAST es útil para comparar valores y devolver el mínimo en una consulta.

SELECT LEAST(column1, column2, column3)
FROM table_name;

En este ejemplo, la consulta devolverá el menor valor de la lista column1, column2, column3. La función LEAST devolverá el valor mínimo de todas las columnas en la lista.

Bloques Anonimos

En PostgreSQL, los bloques anónimos también pueden utilizar la estructura CASE para realizar diferentes acciones en función de diferentes condiciones. Aquí hay un ejemplo de un bloque anónimo que utiliza CASE:

DO $$
DECLARE
  variable INT := 5;
BEGIN
  CASE
    WHEN variable > 10 THEN
      RAISE NOTICE 'Variable is greater than 10';
    WHEN variable < 10 THEN
      RAISE NOTICE 'Variable is less than 10';
    ELSE
      RAISE NOTICE 'Variable is equal to 10';
  END CASE;
END $$;

En este ejemplo, se declara una variable variable con un valor de 5. Luego, se utiliza la estructura CASE para evaluar el valor de variable y mostrar un mensaje diferente en función de si es mayor que 10, menor que 10 o igual a 10.

Los bloques anónimos con CASE son útiles para realizar tareas simples y no repetitivas que requieren una lógica de selección. Sin embargo, para tareas más complejas o repetitivas, es mejor utilizar funciones o procedimientos almacenados en lugar de bloques anónimos.

👉SOLUCIÓN:
Estaba solucionando el reto y se me presentó un error de “sintaxis”. Pensé que podría ser la versión que tenía pero resulto ser algo sencillo. Al realizar el query con CASE debes colocar una coma. Comparto mi resultado

Este seria mi aporte

hola, acá mi aporte:

SELECT id, nombre, direccion_residencia, fecha_nacimiento, COALESCE('cumple') "primer letra es o",
 CASE
WHEN fecha_nacimiento<='2004-01-31' THEN
'tiene mas de 18 años'
ELSE
'tiene menos de 18 años'
END
 FROM pasajero
WHERE nombre ILIKE 'o%';
SELECT id, nombre, fecha_nacimiento,
    CASE
	WHEN nombre ILIKE 'o%' THEN 'Inicia con O'
	WHEN nombre ILIKE 'p%' THEN 'Inicia con P'
	ELSE 'otra letra'
	END AS "Inicial de nombre",
	CASE
	WHEN (current_date-fecha_nacimiento)/365 > 18 THEN 'Mayor de edad'
	ELSE 'Menor de edad'
    END AS mayor_o_menor
    FROM pasajero;
SELECT nombre, fecha_nacimiento 
  FROM public.pasajeros
  WHERE nombre ILIKE 'a%'
  AND fecha_nacimiento < '2008-01-01'
  ORDER BY fecha_nacimiento ASC;

Consultar quienes empiezan su nombre por la letra A

SELECT * FROM passengers
WHERE NAME ILIKE ´a%';

postgres=# \c transport
You are now connected to database “transport” as user “postgres”.
transport=# SELECT * FROM passengers WHERE name ILIKE ‘a%’;
id | name | address | age
----±-----------------±-----------±-----------
19 | Arabel Mournian | Crest Line | 1986-06-01
26 | Ariella Boatman | Bunting | 2010-09-22
34 | Alli Petriello | John Wall | 1985-03-12
53 | Amos Tremathick | Cordelia | 2016-01-30
55 | Abbey Taffurelli | Division | 1975-11-10
71 | Alyson Willment | Merry | 1997-02-12
84 | Ambrosius Curman | Morrow | 1996-03-01
88 | Alaine Dell Casa | Toban | 1975-03-25
(8 rows)

transport=#

quienes tienen más de 18 años

SELECT id, name, address,
('2023-01-16' - age) / 365 age
FROM passengers
WHERE age < '2005-01-16';

id | name | address | age
-----±---------------------±----------------±----
2 | Pasajero 2 | St 123 #1565 | 29
3 | Jaime Measom | Reinke | 20
4 | Evered Braune | Dapin | 48
8 | Kitty Abdie | Petterle | 29
10 | Shane Huntar | La Follette | 23
11 | Jerry Chappelle | Northview | 24
12 | Nikolaus Scedall | Dayton | 25
13 | Laraine McGonagle | Becker | 47
14 | Branden Pretsel | Kim | 26
15 | Etienne Tulleth | Ramsey | 43
18 | Tedd Crayker | Carberry | 39
19 | Arabel Mournian | Crest Line | 36
20 | Justin Oxenden | Bluejay | 37
21 | Hetti Jonczyk | Lawn | 31
23 | Barron Zanicchi | International | 47
24 | Elsbeth Perett | Summerview | 33
25 | Ragnar Cratere | Spohn | 20
28 | Bobbette Manifold | Summerview | 47
29 | Marleah Cosans | Beilfuss | 20
30 | Margarette Yurocjkin | Merrick | 21
32 | Cad Connealy | Barby | 18
:

Con esta consulto verifico los pasajeros donde el nombre contenga la letra “p”

SELECT *,
CASE
WHEN name ILIKE '%p%' THEN name
ELSE 'N/A'
END
FROM passengers
ORDER BY name;

Resultado del Ejercicio

-- Verifica si el nombre del pasajero inicia con la letra ‘o’ 
-- o si es mayor o menor de edad segun su fecha de nacimiento.
SELECT id, nombre, (current_date-fecha_nacimiento)/365 AS edad, 
CASE
	WHEN nombre LIKE 'O%' THEN 'Inicia con letra O'
	WHEN (current_date-fecha_nacimiento)/365 > 17 THEN 'Mayor de edad'
	ELSE 'Menor de edad'
END AS resultado_condicion
FROM pasajeros;

.
Revisando los comentarios, encontré esta otra manera de hacerlo:

SELECT id, nombre, DATE_PART('YEAR',AGE(fecha_nacimiento)) AS edad, 
CASE
	WHEN nombre LIKE 'O%' THEN 'Inicia con letra O'
	WHEN DATE_PART('YEAR',AGE(fecha_nacimiento)) > 17 THEN 'Mayor de edad'
	ELSE 'Menor de edad'
END AS resultado_condicion
FROM pasajeros;

SINTAXIS:

CASE WHEN <condición>
THEN <acción si se cumple>
ELSE <acción si no se cumple>
END
´
Ejemplo:

SELECT id, nombre, direccion_residencia, fecha_nacimiento, 
CASE
	WHEN fecha_nacimiento > '2002-01-01' 
	THEN 'Niños'
	ELSE 'Persona Mayor'
	END
FROM pasajeros;

Aquí el código que usé:

SELECT nombre, fecha_nacimiento,
CASE
WHEN nombre ILIKE ‘a%’ THEN 'con A’
WHEN nombre ILIKE ‘p%’ THEN 'con p’
WHEN ( current_date - fecha_nacimiento) > 18250 Then 'Es un adulto mayor’
ELSE 'Su nombre no inicia con A, ni P y ademas es un chichi’
END
FROM pasajero ORDER BY fecha_nacimiento;

Este el código que utilice:
SELECT id, nombre, fecha_nacimiento,
CASE
WHEN nombre ILIKE ‘a%’ THEN 'Comienza con A’
WHEN nombre ILIKE ‘e%’ THEN 'Comienza con E’
WHEN nombre ILIKE ‘i%’ THEN 'Comienza con I’
when nombre ilike ‘o%’ then 'Comienza con O’
WHEN ( current_date - fecha_nacimiento) > 6570 Then 'Es mayor de 18 años’
ELSE 'Su nombre no inicia con A, E, I, O y ademas es un niño’
END
FROM pasajero ORDER BY fecha_nacimiento;

Verifica si el nombre del pasajero inicia con la letra ‘B’ o si es mayor o menor de edad segun su fecha de nacimiento.

SELECT id, nombre, direccion_residencia, fecha_nacimiento,
	CASE WHEN nombre LIKE 'B%'
		THEN 'Si'
		ELSE 'No'
	END AS empieza_por_B,
	CASE WHEN fecha_nacimiento < '2004/01/01'
		THEN 'Mayor'
		ELSE 'Menor'
	END AS es_adulto
FROM public.pasajeros
ORDER BY fecha_nacimiento DESC;

Adjuntos los pasos que he utilizado para obtener unas fechas/horas lógicas para la columna Fin

Dejo otra forma de abordar si es mayor o menor de edad usando la funcion EXTRACT

select nombre,fecha_nacimiento,
	case
when (extract (year from current_date)) - (extract (year from fecha_nacimiento)) <= 18   THEN 
	'Menor'
else 
	'Mayor'
end
from public."Pasajeros"

esto fue lo que hice yo:

SELECT id, nombre, direccion_recidencia, fecha_nacimiento,
	CASE 
		WHEN (EXTRACT(YEAR FROM CURRENT_DATE) - EXTRACT(YEAR FROM fecha_nacimiento))>18 THEN
		'mallor 18'
		ELSE
		'menor'
		END as mallor,
	CASE 
		WHEN nombre ILIkE  'A%' THEN
		'inicial A'
		ELSE
		'no inicia A'
		END as inicial
FROM public.pasageros;

Mi solución 😄, en mi caso ya todos son mayores de edad, asi que lo hice con mayores del 2000

SELECT id, nombre, fecha_nacimiento,
CASE
WHEN nombre ILIKE 'g%' AND fecha_nacimiento > '2000-01-01'
THEN 'cumple'
ELSE 'no cumple'
END
FROM public.pasajero;

No es la gran cosa pero algo es algo, también puse una forma de nombrar el resultado en lugar de que, aparezca “case”

<select nombre,
case 
when fecha > '01-01-1999' then 
'Adulto' 
else 
'Menor de edad'
end AS estatus,
case 
when nombre  LIKE'a%' then 
'Empieza con a' 
when nombre  LIKE'e%' then 
'Empieza con e' 
when nombre  LIKE'i%' then 
'Empieza con i'
when nombre  LIKE'o%' then 
'Empieza con o'
when nombre  LIKE'u%' then 
'Empieza con u'
else 
'No aplica nombre'
end AS nombre_aplicable
from pasajeros;> 

Reto:

Están increíblemente simples los ejemplos con la vida real, esto no sirve de nada …

Asi es como yo comprendo! y para dar un espacio en la tabla es poner END AS “EDAD ADMITIDA”.

--mayor 18 
--nombre comienza con P

SELECT id, nombre, direccion,fecha, 
	CASE 
		WHEN nombre ILIKE 'p%' THEN 'Comienza con P'
		ELSE 'No'
	END as Letra,
		CASE WHEN fecha < '2004-01-01' THEN 'Adulto'
		ELSE 'Niño'
	END as tipo
	
FROM public.pasajero
SELECT id, nombre, fecha_nacimiento,
CASE
WHEN  (CURRENT_DATE - fecha_nacimiento)/365 >= 18  THEN
'MAYOR  de 18'
ELSE 
'MENOR de 18'
END
	FROM public.pasajero
	WHERE nombre ILIKE 'a%'
	ORDER BY fecha_nacimiento DESC;

Mi aporte para el reto

select id, nombre, fecha_nacimiento,
(case 
when nombre ilike 'o%' then 'Comienza con la letra O'
else 'Inicia con otra letra'
end) as Name,
(case
when (EXTRACT (YEAR from CURRENT_DATE) - EXTRACT (YEAR from fecha_nacimiento)) >= 18 then 'Es mayor de edad'
else 'Es menor de edad'
end) as validacion_edad
from pasajero;

Saudos!

Mi aporte por el reto

SELECT id, nombre, fecha_nacimiento,
CASE
WHEN nombre ILIKE 'o%' THEN
'Comienza con la letra O'
WHEN (current_date - fecha_nacimiento) > 6570 THEN
'Es mayor de 18'
ELSE
'Es menor de edad'
END
	FROM public.pasajeros 
	ORDER BY fecha_nacimiento;

Hay alguna manera de colocar mas de una variable en CASE para un mismo ‘THEN’? intente todas las maneras que pude imaginar y no pude.
Dejo mi code.

SELECT id, nombre, fecha_nacimiento,
(
CASE 
	WHEN ( current_date - fecha_nacimiento)/365 >= 18
	THEN 'mayor_de_edad'
	ELSE 'menor_de_edad'
END) as edad,
(
	CASE
	WHEN nombre ILIKE 'p%' THEN 'sexy people'
	WHEN nombre ILIKE 'l%' THEN 'sexy people'
	WHEN nombre ILIKE 'a%' THEN 'sexy people'
	WHEN nombre ILIKE 't%' THEN 'sexy people'
	WHEN nombre ILIKE 'z%' THEN 'sexy people'
	WHEN nombre ILIKE 'i%' THEN 'sexy people'
	ELSE 'no estudia en platzi'
END) as estudiante
FROM public.pasajero;

Reto:

SELECT id, nombre, direccion_residencia AS Residencia, fecha_nacimiento AS Nacimiento,
	DATE_PART('YEAR',AGE(fecha_nacimiento)) AS "Años", DATE_PART('MONTH',AGE(fecha_nacimiento)) AS "Meses",
CASE
WHEN nombre ILIKE 'p%' THEN
'Letra P'
ELSE 'Otra letra'
END AS "Letra_inicial",
CASE WHEN EXTRACT (YEAR FROM CURRENT_DATE) - EXTRACT (YEAR FROM fecha_nacimiento) >= 18 THEN
	'Mayor de edad'
ELSE
	'Menor de edad'
END AS Estado_edad
FROM public.pasajero
--WHERE nombre ILIKE 'p%';
select 
nombre, 
DATE_PART('year', AGE(current_date, fecha_nacimiento)) AS años, 
DATE_PART('month', AGE(current_date, fecha_nacimiento)) AS meses, 
DATE_PART('day', AGE(current_date, fecha_nacimiento)) AS dias,
fecha_nacimiento
from pasajeros
where nombre ilike 'o%'
select id, nombre, fecha_nacimiento,
CASE
WHEN fecha_nacimiento < '1998-01-01' then 
'mayor de edad'
else 
'pequeñuelo'
end
from public.pasajero
where nombre like 'S%';

SELECT nombre_pas AS Nombre,
CASE
WHEN fecha_nac > ‘1999-12-31’ THEN
’Joven’
ELSE 'Adulto’
END AS “Rango”,
CASE
WHEN nombre_pas ILIKE ‘D%’ THEN
’Con D’
ELSE 'Sin D’
END AS “Comienza con letra D”,
Case
WHEN extract(years from age(current_timestamp,fecha_nac::timestamp)) >= 21 THEN
’Mayor de edad.'
ELSE 'Menor de edad.'
END AS "Adultez"
FROM pasajero;

Aquellos pasajeros que su nombre empieza por una vocal y quienes son mayores de edad o menores de edad

select nombre as nombre_vocal,
case 
when fecha_nacimiento > '2004-01-01' then 'Mayor de edad' else 'Menor de edad' end as mayor_o_menor
from pasajero
where nombre ~'^[AEIOU]';

Buenos dias, comparto mi query por si les sirve de algo:

SELECT id, name, address, birthdate,
	case when birthdate < '2004-08-24' then 'Mayor'
	else 'Menor'
	end as mayor_o_menor
	FROM public.passengers
	where name like 'A%';

Saludos…