No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Curso de PostgreSQL

Curso de PostgreSQL

Oswaldo Rodr铆guez Gonz谩lez

Oswaldo Rodr铆guez Gonz谩lez

Funciones Especiales Avanzadas

20/32
Recursos

Aportes 205

Preguntas 6

Ordenar por:

Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Reg铆strate o inicia sesi贸n para participar.

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;```

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;

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

lo hice simple pero funciono.

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;
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%';```

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;

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;

Esta es mi soluci贸n al ejercicio:

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

--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!!!

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;

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;```

Les comparto mi reto

SELECT id, COALESCE(nombre,'N/A') as nombre, direccion_residencia, fecha_nacimiento,
	CASE
		WHEN fecha_nacimiento > '2004-06-29' THEN
		'MENOR DE EDAD'
		ELSE
		'MAYOR DE EDAD'
	END as Mayoria_Edad,
	CASE
		WHEN nombre ILIKE 's%' THEN
		'Empieza con S'
		WHEN nombre ILIKE 'l%' THEN
		'Empieza con L'
		WHEN nombre ILIKE 'n%' THEN
		'Empieza con N'
		WHEN nombre ILIKE 'a%' THEN
		'Empieza con N'
		WHEN nombre ILIKE 'm%' THEN
		'Empieza con M'
		WHEN nombre ILIKE 'h%' THEN
		'Empieza con H'
		else 'N/A'
	END AS Inicial_Nombre
from public."Pasajeros";

Reto Cumplido!

SELECT id, nombre, fecha_nacimiento,
CASE
	WHEN nombre ILIKE 'T%' THEN
		'Inicio del nombre por T'
	ELSE
		'No inicia por T'
END AS "Nombre por T" ,
CASE 
	WHEN fecha_nacimiento < '2004-06-28' THEN
		'Mayor de 18 a帽os'
	ELSE
		'Menor de Edad'
END AS "Edad"
FROM public.pasajero;
select id, nombre, direccion, fecha,
case 
when  nombre ilike 'A%' then 
'con vocal a'
else 
'nope'
end
from pasajeros

Aqui mi solucion, tal vez no es la m谩s optima, pero es con lo aprendido hasta ahora

Respuesta al reto:
SELECT *,
CASE
WHEN EXTRACT(YEAR FROM current_date) - EXTRACT(YEAR FROM fecha_nacimiento) <=18 AND
nombre ILIKE 鈥榦%鈥 THEN
鈥機umple ambas condiciones鈥
ELSE
鈥橬o cumple ambas condiciones鈥
END
FROM Public.鈥淧asajero鈥;

Aqu铆 esta mi respuesta, espero les guste

Verifica si un Nombre empieza por la U:

SELECT id, nombre, direccion_residencia, fecha_nacimiento,
CASE
WHEN nombre ILIKE 鈥榰%鈥 THEN
鈥機omienza con la letra U鈥
ELSE
鈥橬o comienza con la letra U鈥
END
FROM public.pasajero

**ME FALTO LO DEL MAYOR DE EDAD, Pero en mi bases de datos, en la informac贸n de fecha de nacimientos, Todos son del a帽o 2021 y 2022 **

SELECT nombre, CASE 
WHEN nombre LIKE 'A%' THEN 'SE ENCUENTRA'
ELSE 'No se encuentra ningun nombre'
END 
 FROM pasajeros

Reto resuelto! (en caso de poder mejorar algo, me encantar铆a opiniones de eso)

SELECT nombre, fecha_nacimiento,
CASE
	WHEN 
		(EXTRACT(YEAR FROM CURRENT_DATE)-EXTRACT(YEAR FROM fecha_nacimiento)) >= 18
	THEN 'Adulto'
	ELSE 'Ni帽o'
END "Mayor de edad",
CASE
	WHEN nombre ILIKE 'e%'
		THEN 'Nombre encontrado'
	ELSE 'No coincide'
END "Inicio con letra"
FROM pasajeros
ORDER BY nombre ASC;

Algo curioso y que descubrir fue la sentencia AGE, en caso de saber la edad actual del pasajero (en n煤meros) por ejemplo: nac铆 en el 2002, la base de datos me puede devolver mi edad (que seria 20 a帽os) es similar al c贸digo de arriba.

SELECT nombre, fecha_nacimiento,
			 EXTRACT(YEAR FROM AGE(CURRENT_DATE,fecha_nacimiento)) AS "edad actual",
CASE
	WHEN 
	(EXTRACT(YEAR FROM CURRENT_DATE)-EXTRACT(YEAR FROM fecha_nacimiento)) >= 18
	THEN 'Adulto'
	ELSE 'Ni帽o'
END "Mayor de edad",
CASE
	WHEN nombre ILIKE 'e%'
		THEN 'Nombre encontrado'
	ELSE 'No coincide'
END "Inicio con letra"
FROM pasajeros
ORDER BY nombre ASC;
<SELECT id, nombre, direccion_residencia, fecha_nacimiento,
CASE WHEN
EXTRACT(YEAR FROM age(timestamp 'now()',date(fecha_nacimiento)))>18 THEN
'MAYOR'
ELSE
'MENOR'
END as adultez,
CASE  
WHEN nombre ILIKE 'k%' THEN 'aplica'
ELSE 'nada'
END as kbegin
FROM public.pasajero;> 

la funcion age nos da la resta entre las dos fechas, a帽o, mes y dias exactos, precisamente por ello se utiliza la funcion extract para utilizar solo los a帽os.

SELECT id, nombre, direccion_residencia, fecha_nacimiento,
CASE
WHEN fecha_nacimiento > '2004-05-01' THEN
'Menor_E'
ELSE
'Mayor_E'
END

	FROM public.pasajero
	WHERE nombre ILIKE 'd%';

Con el siguiente query obtuve los pasajeros mayores de edad. Al final me tuve que guiar de algunos compa帽eros, gracias por sus aportes.

SELECT *,
CASE
WHEN EXTRACT(YEAR FROM(AGE(fecha_nacimiento))) >= 18 THEN 'Mayor de edad'
ELSE 'Menor de edad'
END AS "Mayor de edad"
FROM pasajero
ORDER BY nombre asc;

select id ,nombre ,direccion_residencia ,fecha_nacimiento ,
case
when nombre ilike (鈥榬%鈥) then
鈥橧nicia con R鈥 else
鈥橬o inicia con R鈥
end ,
case
when fecha_nacimiento > 鈥2004-04-25鈥 then
鈥橫ayor de edad鈥 else
鈥橫enor de edad鈥
end
case
from pasajero p ;

Mi solucion:

SELECT id, nombre, direccion_residencia, fecha_nacimiento,
CASE
WHEN (extract( year from current_date)) - 
    (extract(year from fecha_nacimiento))
    = 18 THEN
'+18'
ELSE 
'-18'
END,
CASE
WHEN nombre LIKE 'D%' THEN
'Con D'
ELSE 
'Sin D'
END
    FROM public.pasajero;

Para usuarios de MAC
Cuando el no ponga comillas nosotros debemos usar las comillas dobles 鈥溾, si estamos llamando a una columna o tabla

Mi aporte.
![](

RETO

SELECT id, nombre, direccion_residencia, fecha_nacimiento,
CASE
WHEN nombre ILIKE 'o%' THEN
'Comienza con "o"'
ELSE
'No comienza con "o"'
END AS comienza_con_o,

CASE
WHEN current_date - fecha_nacimiento > 18*365 THEN
'Tiene mas de 18'
ELSE
'Tiene menos de 18'
END AS mayor_de_edad
	FROM public.pasajeros;

Reto: Agregar una columna adicional que diga quienes empieza su nombre por la 鈥榣鈥 y quienes tienen mas de 18 a帽os.

SELECT id, nombre, fecha_nacimiento,
CASE WHEN nombre ILIKE 'l%' THEN
'Empieza con l'
ELSE
'No empieza con l'
END AS letra_l,

CASE WHEN date_part('year', age(CURRENT_DATE, fecha_nacimiento)) >= 18 THEN
'Mayor'
ELSE
'Menor'
END AS clasificacion_edad
FROM public.pasajero;

Reto;

SELECT *,
CASE
WHEN fecha_nacimiento > '2015-01-01' THEN
'Ni帽o'
ELSE
'Mayor' 
END,
CASE
WHEN fecha_nacimiento < '2003-01-01' THEN
'Mayor de 18 a帽os'
ELSE
'Menor de 18 a帽os' 
END,
CASE
WHEN nombre ILIKE 'E%' THEN
'Empieza con E'
ELSE
'NO Empieza con E' 
END
FROM pasajeros;

Saludos 馃槂

Informaci贸n resumida de esta clase
#EstudiantesDePlatzi

  • COALESCE: Me permite comparar dos valores y saber cu谩l de los dos no es Null
  • NULLIF = Me ayuda a comparar valores y si son iguales retorna Null
  • GREATEST = Me permite compara valores y me retorna el mayor
  • LEAST = Me permite comparar valores y me retorna el menor
  • BLOQUES ANONIMOS = Me permite ingresar condicionales dentro de una consulta de base de datos
  • Cuando usamos el case debemos indicar cuando cierra 馃槂
select *,
CASE
WHEN modelo ilike 'o%' then
'Modelo o'
WHEN modelo ilike 'a%' then
'Modelo a'
when modelo ilike 'B%' then
'Modelo B'
else
'Modelo sin determinar'
end
from trenes;

Mi ejercicio鈥
SELECT id, name, address, dates,
CASE
WHEN name ILIKE 鈥榟%鈥 THEN 'Inicia por H鈥
WHEN name ILIKE 鈥楯%鈥 THEN 'Inicia por J鈥
ELSE
鈥橧nicia por otra鈥
END
FROM public.passengers;

Mi query

<SELECT id, nombre, fecha_nacimiento,
CASE
WHEN pasajero.nombre ILIKE 'B%' AND pasajero.fecha_nacimiento <= '2004-01-01' THEN
'Nombre que comienza con B y son mayores de 18'
ELSE
'No Aplica'
END AS "Filtro"
	FROM public.pasajero;
> 

woooo, no de las consultas fue maravilloso馃馃

SELECT id, nombre, direccion_residencia, fecha_nacimiento,
CASE
WHEN fecha_nacimiento <= '2004-03-09' AND 
	nombre ILIKE 'a%'
THEN
'Nombre empieza por A y es Mayor de 18 a帽os'
ELSE
'No aplica'
END AS Condicional
	FROM public.pasajeros;

mi aporte

SELECT *,
CASE
WHEN fecha_nacimiento > '2003-01-01'
THEN 'ni帽o'
ELSE 'Mayor'
END
AS tipo
FROM public.pasajero
WHERE pasajero.nombre ILIKE 'a%' AND
fecha_nacimiento <= '2003-01-01';

Aqu铆 dejo mi respuesta paa lo requerido por el profesor

SELECT *, 
CASE 
	WHEN nombre ILIKE 'm%' 
		THEN
			'Si'
		ELSE
			'NO'
	END AS empieza_por_m,
CASE 
	WHEN 2022 - EXTRACT (YEAR FROM fecha_nacimiento) > 18
		THEN
			'Mayor'
		ELSE
			'Menor'
	END AS mayor_edad
FROM pasajeros

SELECT id, nombre, direccion_residencia, fecha_nacimiento,
	CASE
	WHEN fecha_nacimiento > '2015-01-01' THEN 'Child'
	ELSE 'Adult' END,
	CASE
	WHEN nombre ILIKE 'o%' THEN 'EL ELEGIDO'
	ELSE 'CIUDADANO COMUN' END
	FROM public.pasajero;

As铆 agregamos una columna calculada que nos identifique si nuestros usuarios del sistema de transporte son mayores o menores en funci贸n de su fecha de nacimiento.

SELECT *,
CASE 
WHEN "PASAJERO".fecha < '2004-02-26' THEN 'Mayor'
ELSE 'Menor'
END Tipo
FROM public."PASAJERO";

Consulta para que me muestre los pasajeros que empiezan con 鈥渕鈥 como yo:

SELECT * FROM public."PASAJERO"
WHERE "PASAJERO".nombre ILIKE 'm%';

SELECT id,COALESCE(nombre, 鈥楴o definido鈥) AS Nombre, direccion_residencia, fecha_nacimiento,
CASE
WHEN SUBSTRING(nombre,1,1) IS NOT NULL THEN
SUBSTRING(nombre,1,1)
ELSE
鈥橬o definido鈥
END AS Empieza_con,
((CURRENT_DATE - fecha_nacimiento)/365) as Edad
FROM public.pasajero
WHERE ((CURRENT_DATE - fecha_nacimiento)/365)>18;

Uso de estructura condicional CASE. CASE WHEN predicado THEN resultado ELSE resultado END

Uso de funci贸n LEAST. Compara un conjunto de valores y retorna el menor.

Uso de funci贸n GREATEST. Compara un conjunto de valores y retorna el mayor

Uso de funci贸n NULLIF. Retorna null si son iguales

Uso de funci贸n COALESCE. Retorna el primer valor que no sea NULL de los argumentos que se le pasen, por ejemplo, SELECT COALESCE (NULL, NULL , 1); // 1 SELECT COALESCE (NULL, 2 , 1); // 2

SELECT id, nombre, "direcci贸n_residencia", fecha_nacimiento,
CASE 
WHEN nombre ILIKE 'a%' THEN 'Empieza por A' 
WHEN date_part('year',current_date) - date_part('year',fecha_nacimiento) >='18' THEN 'Adulto' 
ELSE 'Es menor de edad y/o Su nombre no empieza por A'
END
FROM public.pasajeros;

SELECT id, nom_pasajero, dir_pasajero, nacimiento,
CASE
WHEN nacimiento > 鈥2015-01-10鈥 THEN 'Ni帽o鈥
END AS EDAD,
CASE
WHEN nom_pasajero ilike 'o%'THEN 'O鈥
END AS LETRA
FROM public.pasajero;

Asi quedo mi codigo

SELECT id, nombre, direccion_residencia, fecha_nacimiento,
CASE
WHEN nombre ILIKE 'o%' THEN
nombre
END AS INICIAL_nombre,
CASE
WHEN fecha_nacimiento>'2005-01-01'THEN
'menor de edad'
ELSE
'mayor de edad'
END
FROM public.pasajeros
WHERE (nombre ILIKE 'o%');

Les dejo mi soluci贸n al reto propuesto:

SELECT id, nombre, direccion,  
	EXTRACT ( YEAR FROM age(fecha_nacimiento)) as edad,
	CASE
		WHEN EXTRACT ( YEAR FROM age(fecha_nacimiento)) >= 18 THEN
			'Si'
		ELSE
			'No'
	END as "Es mayor de edad?",
	CASE 
		WHEN nombre ILIKE 'j%' THEN
			'Si'
		ELSE
			'No'
	END as "Su nombre empieza con j?"
	FROM public.pasajero;

Easy peasy 馃槃

Les dejo mi soluci贸n del reto:

SELECT nombre, 
	   fecha_nacimiento, 
	EXTRACT(YEAR FROM age(date('now'),fecha_nacimiento)) edad,
	CASE 
		WHEN EXTRACT(YEAR FROM age(date('now'),fecha_nacimiento))>18
			THEN 'Si'
			ELSE 'No'
		END mayor_edad
FROM public.pasajero
	WHERE nombre ILIKE 'a%';

En versiones recientes posiblemente el COALESCE como lo presenta el profe no funcione, raz贸n por la cual debemos a帽adir el
COALESCE(NULLIF(nombre, 鈥楴ULL鈥),鈥楴/A鈥) para tener algo como Select id,COALESCE(NULLIF(nombre, 鈥楴ULL鈥),鈥楴/A鈥) nombre,direccion_residencia FROM pasajeros order by id asc;


Simple y entendible

SELECT id_pasajero, nombre_pasajero, dir_residencia_pasajero, fech_nac_pasajero,
CASE
	WHEN nombre_pasajero ILIKE 'a%' THEN 'Comienza con A' 
	ELSE 'Inicia con otra letra'
END,
CASE 
WHEN extract(year from current_timestamp ) - extract(year from fech_nac_pasajero) >18 THEN 'Adulto'
ELSE 'Menor de edad'
END
 FROM pasajero;

Mi aporte, al final coloqu茅 un group by para que coloque primero los nombres que empiezan por la letra 鈥楢鈥.

SELECT *, 
CASE
 WHEN nombre ILIKE 'A%' 
 	THEN 'TRUE' ELSE 'FALSE'
 END AS "Nombre_Inicio_con_A",
CASE 
 WHEN fecha_nacimiento > '2004-01-01'
 	THEN 'Menor de edad' ELSE 'Adulto'
END AS "TIPO"
FROM pasajero

ORDER BY "Nombre_Inicio_con_A" DESC;

Resultado:

SELECT nombre AS comienzan_por_la_g, fecha_nacimiento, 
(CASE	
WHEN fecha_nacimiento > '2004-01-13' THEN
'-18 Menor'
ELSE
'+18 Mayor'
END) AS edad

FROM pasajero
WHERE nombre ILIKE 'g%'
SELECT id, nombre, fecha_nacimiento,
CASE 
WHEN nombre ILIKE 'A%' THEN 'Comienza con A'
ELSE 
'Empieza con otra letra'
END AS nombre_A,
CASE
WHEN DATE_PART('year', AGE(fecha_nacimiento)) <= 18 THEN
'Menor de edad'
ELSE
'Mayor de edad'
END AS info_edad
	FROM public.pasajero;

Ejercicio

Cu谩les pasajeros el nombre empieza con la letra M y cu谩les tienen m谩s de 18 a帽os.

SELECT id, nombre, direccion_residencia, fecha_nacimiento,
CASE WHEN nombre ILIKE 'm%' THEN
'True' ELSE 'False' END AS m_name,
CASE WHEN (DATE_PART('year', current_date) - DATE_PART('year', fecha_nacimiento)) > 18 THEN
'True' ELSE 'False' END AS mayor_edad
	FROM public.pasajero;

Me cost贸 un poquito, pero se pudo.

Mi soluci贸n:

SELECT id, nombre, direccion_residencia, fecha_nacimiento,
CASE
WHEN nombre ILIKE 'o%' THEN 'Comienza con O' ELSE '' 
END AS case_nombre,
CASE 
WHEN DATE_PART('year', fecha_nacimiento) < 2004 THEN 'Tiene m谩s de 18' ELSE ''
END AS case_nacimiento
	FROM public.pasajero;

select nombre,
CASE
WHEN nombre ilike 鈥榓%鈥 AND ((DATE_PART(鈥榶ear鈥, current_date::date)-DATE_PART(鈥榶ear鈥, fecha_nacimiento::date))>=18)
then 'si鈥
else 'no鈥
END

from pasajeros ORDER BY nombre;

Aqui va mi ejemplo buscando solo las letras A, E, I; adem谩s de indicar si es adulto o no.

Ejercicio realizado:

SELECT id, nombre, direccion_residencia, fecha_nacimiento,
CASE
	WHEN nombre ILIKE 'o%'  AND fecha_nacimiento < '2003-01-01' THEN
	'Nombre empieza con O y es mayor de edad'
	ELSE
	'Sin interes relevante'
END
FROM public.pasajeros;

Mi aporte

Holi 馃槂 este es el resultado del reto.

SELECT id, nombre, direccion_resindecia, fecha_nacimiento,
CASE 
WHEN fecha_nacimiento < '2003-10-20' THEN 'Mayor de Edad'
ELSE 'Menor de edad'
END
	FROM public.pasajeros
	ORDER BY fecha_nacimiento ASC ;```

My code

SELECT id, name, CASE
WHEN date_part('year', current_date) - EXTRACT(YEAR FROM date_of_birth) > 18  THEN '18 years plus'
ELSE 'Less than 18 years'
END, date_of_birth FROM passengers WHERE name ILIKE 'o%';

Esto me qued贸 as铆

SELECT * from
public.pasajero
where not (current_date - fecha_nacimiento) /365 >= 18
and
nombre ilike 鈥榦%鈥
;

Apuntes y reto:

Funciones especiales avanzadas

  • coalesce -> Te permite comparar 2 valores y regresar el que no es nulo
  • nullif -> Te permite comparar 2 valores y regresa null si son iguales
  • greatest -> Compara un array de valores y regresa el mayor
  • least -> Compara un array de valores y regresa el menor
  • bloques an贸nimos -> condicionales dentro de consultas
SELECT NULLIF(0,0); -- null

SELECT GREATEST(0,1,2,3,4,5,6,7,8,9); -- 9

SELECT LEAST(0,1,2,3,4,5,6,7,8,9); -- 0

------

SELECT id, nombre, direccion_residencia, fecha_nacimiento,
  CASE
  WHEN fecha_nacimiento > '1990-01-01'
  THEN
  'Infante'
  ELSE
  'Mayor de edad'
  END
  FROM public."Pasajeros";

Selecciona personas mayores de cierta edad y que su nombre empiece con 鈥榤|M鈥:

SELECT id, nombre, fecha_nacimiento,
  CASE
  WHEN fecha_nacimiento < '1990-01-01'
  THEN
  'Mayor de edad'
  ELSE
  'Infante'
  END
  FROM public."Pasajeros"
  WHERE nombre ILIKE 'm%';

SELECT *,(CASE WHEN ((CURRENT_DATE - fecha_nacimiento)/365) >= 18 then 鈥榤ayor鈥 else 鈥榤enor鈥 end) FROM pasajero where nombre ilike 鈥榡%鈥

SELECT *,
(CASE
WHEN (EXTRACT(year from current_timestamp) - EXTRACT(year from fecha_nacimiento)) < 18 THEN
鈥橬i帽o鈥
ELSE
鈥橝dulto鈥
END) AS clasificacion
FROM pasajero WHERE nombre LIKE 鈥極%鈥;

Operados de Pl / SQL

Name	Description
>	Greater than operator
>=	Greater than or equal operator
<	Less than operator
<>, !=	Not equal operator
<=	Less than or equal operator
<=>	NULL-safe equal to operator
=	Equal operator
BETWEEN ... AND ...	Whether a value is within a range of values
COALESCE()	Return the first non-NULL argument
GREATEST()	Return the largest argument
IN()	Whether a value is within a set of values
INTERVAL()	Return the index of the argument that is less than the first argument
IS	Test a value against a boolean
IS NOT	Test a value against a boolean
IS NOT NULL	NOT NULL value test
IS NULL	NULL value test
ISNULL()	Test whether the argument is NULL
LEAST()	Return the smallest argument
LIKE	Simple pattern matching
NOT BETWEEN ... AND ...	Whether a value is not within a range of values
NOT IN()	Whether a value is not within a set of values
NOT LIKE	Negation of simple pattern matching
STRCMP()	Compare two strings

SELECT id, nombres, direccion_residencia, fecha_nac,
CASE
WHEN nombres ILIKE 鈥榡%鈥 THEN
鈥橢mpiezan con J鈥

WHEN fecha_nac>=鈥1991-01-01鈥 THEN
鈥橫ayores鈥
END
FROM pasajeros;

SELECT idpasajero, nombre, direccion, fecha,
CASE 
WHEN nombre LIKE "O%" THEN 
"EMPIEZA CON O"
ELSE
"NO EMPIEZA CON O"
END
FROM pasajero;

Soluci贸n


SELECT *, CASE WHEN DATE_PART('YEAR', AGE(fecha_nacimiento)) >= 18 THEN 'Mayor de edad' ELSE 'Menor de edad' END
FROM public.pasajero
WHERE pasajero.nombre ILIKE 'A%'

SELECT id, name, address, birth_date, 
	CASE
		WHEN birth_date < (now()-interval '18 years')
		THEN True
		ELSE False
	END AS is_adult,
	CASE 
		WHEN name ILIKE 'o%'
		THEN True
		ELSE False
	END AS starts_with_o
FROM passenger;

Hola, aqu铆 esta mi aporte de la funci贸n CASE:

--INFORMACION DE LOS PASAJEROS AGREGANDO UNA COLUMNA: CUYOS NOMBRES COMIENZAN POR UNA VOCAL
SELECT nombre,residencia,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 nombre ILIKE 'u%' THEN 'Comienza con u'
ELSE 'No vocal'
END AS vocal
FROM public.pasajero;

--Cuantas personas tienen un nombre que empieza con una vocal
SELECT COUNT(
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 nombre ILIKE 'u%' THEN 'Comienza con u'
END
) as Vocal, count(*) as total FROM pasajero;

--QUIENES TIENEN MAS DE 18 A脩OS?
SELECT nombre,residencia,fecha_nacimiento, 
(EXTRACT(YEAR FROM current_timestamp) - EXTRACT(YEAR FROM fecha_nacimiento)) as edad FROM public.pasajero
WHERE (EXTRACT(YEAR FROM current_timestamp) - EXTRACT(YEAR FROM fecha_nacimiento)) > 18 ORDER BY fecha_nacimiento;

Escog铆 la letra 鈥榡鈥. Adem谩s, para fines pr谩ctico, cambi茅 la fecha a 1985 porque yo le puse un rango al momento de crear la tabla.
Mi c贸digo es el siguiente:

SELECT * ,
	CASE
	WHEN fecha_nacimiento > '1985-1-1' THEN 'Mayor a 1985'
	ELSE 'Menor a 1985'
	END
FROM pasajeros
WHERE nombre ILIKE 'j%';

As铆 lo hice. 馃槃

SELECT  id, nombre, direccion_residencia, fecha_nacimiento,

CASE WHEN fecha_nacimiento < '1998-01-01' THEN 'Mayor'
ELSE 'Menor'
END AS Mayor_Menor,

CASE WHEN nombre Ilike 'a%'  THEN 'A'
ELSE 'Otra letra'
END as letra_Inicial_A

FROM pasajero;