Tengo la siguiente tabla en PostgreSQL 11.0
min age max age 1 Month 12 Months 1 Year 16 Years 1 Day 365 Days 365 Days 369 Days N/AN/A NULL NULLMe gustaría convertir los valores al año. Estoy extrayendo la cadena después del dígito y compruebo si son 'años', 'meses' o 'días' y luego convierto el dígito antes de la cadena en año.
Intenté la siguiente consulta:
update tbl set min_age = case when substring(min_age, '^\d+\s(.*)') ~* 'Month' then abs(substring(min_age, '^(\d+)\s.*')/12) when substring(min_age, '^\d+\s(.*)') ~* 'Months' then abs(substring(min_age, '^(\d+)\s.*')/12) when substring(min_age, '^\d+\s(.*)') ~* 'Day' then abs(substring(min_age, '^(\d+)\s.*')/365) when substring(min_age, '^\d+\s(.*)') ~* 'Days' then abs(substring(min_age, '^(\d+)\s.*')/365) when substring(min_age, '^\d+\s(.*)') ~* 'Year' then abs(substring(min_age, '^(\d+)\s.*')) when substring(min_age, '^\d+\s(.*)') ~* 'Years' then abs(substring(min_age, '^(\d+)\s.*')) end ; update tbl set max_age = case when substring(min_age, '^\d+\s(.*)') ~* 'Month' then abs(substring(min_age, '^(\d+)\s.*')/12) when substring(min_age, '^\d+\s(.*)') ~* 'Months' then abs(substring(min_age, '^(\d+)\s.*')/12) when substring(min_age, '^\d+\s(.*)') ~* 'Day' then abs(substring(min_age, '^(\d+)\s.*')/365) when substring(min_age, '^\d+\s(.*)') ~* 'Days' then abs(substring(min_age, '^(\d+)\s.*')/365) when substring(min_age, '^\d+\s(.*)') ~* 'Year' then abs(substring(min_age, '^(\d+)\s.*')) when substring(min_age, '^\d+\s(.*)') ~* 'Years' then abs(substring(min_age, '^(\d+)\s.*')) endLa salida esperada es:
min age max age 0 1 1 16 0 1 1 1 N/AN/A NULL NULLCualquier ayuda es muy apreciada.
Postgres tiene potentes funciones de intervalo. Creo que un cast y justify_interval() podrían funcionar aquí:
select extract(year from justify_interval(min_age::interval)) min_age, extract(year from justify_interval(max_age::interval)) max_age from tblmin_año | max_yr :----- | :----- 0 | 1 1 | dieciséis 0 | 1 1 | 1
Así es como puede obtener todos los valores que necesita:
select split_part(min_age, " ", 1) as min_age_value, split_part(min_age, " ", 2) as min_age_unit, split_part(max_age, " ", 1) as max_age_value, split_part(max_age, " ", 2) as max_age_unit from tbl;Ahora, puede usar lo anterior como una subcadena y usar case-when para min_age_unit y max_age_unit en la consulta externa, evaluándolo a 1, 12 o 365 respectivamente y multiplicándolo por el valor real.