以下这个postgreSQL是什么意思

, case when i.time_at_job IN ('6_m', '6', '1_to_3_months')
then 0
when i.time_at_job IN ('6_months_to_1_year',
'1_year_to_', '7_months_to_1_year', '1_y') then 1
when i.time_at_job IN ('1_year_to_2_years',
'2_years', '2 years') then 2
when i.time_at_job IN ('2_years_or',
'2_years_or_more','more_than_2_years') then 3
when i.time_at_job ~ '^[0-9]+$' AND
(i.time_at_job::integer >= 60 OR
(i.time_at_job::integer >= 5 AND
i.time_at_job::integer < 12)) then 5
when i.time_at_job ~ '^[0-9]+$' AND
i.time_at_job::integer >= 12 then
round(i.time_at_job::float / 12)
when i.time_at_job ~ '^[0-9]+$' AND
i.time_at_job::integer < 5 then i.time_at_job::integer
else NULL end as time_at_job

还有请详细叙述一下~ '^[0-9]+$'这些符号是什么意思
谢谢
最新回答
凉城无爱

2022-10-09 17:04:44

这段代码主体是case when 判断语句,是根据i.time_at_job值的不同而返回不同的数值。
前面3个when是按特定的字串来返回特定的数值(如6_m返回0; 6_months_to_1_year返回1; 1_year_to_2_years返回2);
从第四个when开始(有~ '^[0-9]+$'的条件),是先按照正则表达式匹配到i.time_at_job为数值字符串,再按照将i.time_at_job转换为数值之后的范围来返回不同的值: 大于等于5且小于12,或者大于等于60返回5;大于等于12时返回除以12的四舍五入值整数(round函数);如果小于5,则返回转换后的整数值。
~ '^[0-9]+$'这个符号应该作为两个部分: ~为正则表达式的匹配运算符,它是区分大小写的,它是一个2元运算符,如果~前的字符串匹配后面的正则表达式,则返回true,否则返回false;后面的字符串为一个正则表达式字符串,代表要匹配的字符串必须全部为数字,并且至少有一个数字。用在该SQL中的作用就是确保i.time_at_job的值为一个数字字符串。
追问
谢谢您的回答, 我还有一些疑问

when i.time_at_job ~ '^[0-9]+$' AND
i.time_at_job::integer < 5 then i.time_at_job::integer

~ '^[0-9]+$' 中的~ 怎么理解? 还有 then i.time_at_job::integer 是否输出的是数字?

另外 整个code输出出来的格式有可能是什么样的?

谢谢
追答
~是正则表达式的运算符号,格式stringValue ~ regexValue,其中, stringValue为一个字符串,regexValue为一个正则表达式的字符串;
i.time_at_job::integer是将i.time_at_job转换成整型,::是postgreSQL中的类型转换写法,将符号前的变量转换为符号后指定的类型值;
这个case when得到的结果应该是一个整型值(可能为NULL)。
追问
OK 基本明白了 ~的意思就是开始匹配的意思 

整个Code输出出来是不是一列数 类似

time_at_job

0
1
2
3
5

这样之类的数字?
追答
只能说这个case when结构返回的是数值,具体查询输出的是什么内容,则是要看你完整的SQL查询语句。
如果SQL语句为select case when ... end as time_at_job from ...,那么得到的结果集就是类似你所举例的那样。
追问
万分感谢!
追答
PostgreSQL还是有很多自己的特性的,就比如这个正则表达式的运算符,像我一直用SQL Server就没有用过这种运算符。这些都是从PostgreSQL帮助文档学来的,只要多看看PosgreSQL的文档,你就能发掘更多的好东西。