在postgresql11.0中我有下表
min age max age
1 Month 12 Months
1 Year 16 Years
1 Day 365 Days
365 Days 369 Days
N/A N/A
NULL NULL
我想把这些值转换成年份。我正在提取数字后面的字符串,检查它是'years'、'months'还是'days',然后将字符串前面的数字转换为year。
我尝试了以下查询:
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.*'))
end
预期输出为:
min age max age
0 1
1 16
0 1
1 1
N/A N/A
NULL NULL
非常感谢您的帮助。
2条答案
按热度按时间ifsvaxew1#
postgres具有强大的区间函数。我认为这是一个
cast
以及justify_interval()
可能在这里工作:db小提琴演示:
guykilcj2#
这就是如何获得所需的所有值:
现在,您可以将上面的内容用作子字符串和用例,在外部查询中为min\u age\u unit和max\u age\u unit分别求值为1、12或365,并将其与实际值相乘。