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(鈥榶ear鈥,current_date) - date_part(鈥榶ear鈥,fecha_nacimiento)) >= 18 THEN
鈥橫ayor de Edad鈥
ELSE
鈥橫enor de Edad鈥
END as Tipo,
CASE WHEN upper(nombre) LIKE 鈥極%鈥 THEN
鈥橧nicia con O鈥
ELSE
鈥橬o 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 鈥榓%鈥 then
鈥橢mpieza con A鈥
ELSE
鈥橬o empieza con A鈥
END,
CASE
WHEN birth_date>鈥25-01-2004鈥 then
鈥橫enor de edad鈥
ELSE
鈥橫ayor 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 鈥榦%鈥 THEN
鈥橧nicia con O鈥
ELSE
鈥橧nicia con otra letra鈥
END AS Inicial,
CASE
WHEN ((CURRENT_DATE-fecha_nacimiento)/365) >= 18 THEN
鈥橫ayor鈥
ELSE
鈥橫enor鈥
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.

鈥揜ETO

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
鈥橬ino鈥
ELSE
鈥楳ayor鈥
END

FROM public.pasajero
WHERE nombre = ILIKE 鈥榦%鈥;

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 鈥榓%鈥 THEN
鈥機omienza con A鈥
WHEN nombre ILIKE 鈥榞%鈥 THEN
鈥機omienza con G鈥
WHEN nombre ILIKE 鈥榩%鈥 THEN
鈥機omienza con P鈥
END AS 鈥淟etra inicial鈥,
CASE
WHEN (CURRENT_DATE - fecha)>6570 THEN
鈥橢s mayor a 18 a帽os鈥
ELSE
鈥橢s 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 鈥淲HEN鈥 con el operador logico 鈥淎ND鈥, muy similar a como se hace en el lenguaje de programaci贸n 鈥淧ascal鈥

En el caso de 鈥淕REAST鈥 y 鈥淟EAST鈥 me dio mejor resultado con 鈥淢AX鈥 y 鈥淢IN鈥 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 鈥渟intaxis鈥. 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 鈥渢ransport鈥 as user 鈥減ostgres鈥.
transport=# SELECT * FROM passengers WHERE name ILIKE 鈥榓%鈥;
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 鈥減鈥

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 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 鈥榓%鈥 THEN 'con A鈥
WHEN nombre ILIKE 鈥榩%鈥 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 鈥榓%鈥 THEN 'Comienza con A鈥
WHEN nombre ILIKE 鈥榚%鈥 THEN 'Comienza con E鈥
WHEN nombre ILIKE 鈥榠%鈥 THEN 'Comienza con I鈥
when nombre ilike 鈥榦%鈥 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 鈥楤鈥 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 鈥渃ase鈥

<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 鈥淓DAD 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 鈥楾HEN鈥? 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
鈥橨oven鈥
ELSE 'Adulto鈥
END AS 鈥淩ango鈥,
CASE
WHEN nombre_pas ILIKE 鈥楧%鈥 THEN
鈥機on D鈥
ELSE 'Sin D鈥
END AS 鈥淐omienza con letra D鈥,
Case
WHEN extract(years from age(current_timestamp,fecha_nac::timestamp)) >= 21 THEN
鈥橫ayor 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鈥