Postgres中的REGEXP_COUNT个

时间:2018-09-20 11:36:17

标签: postgresql postgresql-9.3

我们正在从Oracle迁移到Postgres。

这是SQL,在这里我曾经从employee_name列中提取数据并用于报告。

但是现在我不确定如何执行regex_count部分。 Oracle SQL

with A4 as 
(
select 'govinda j/INDIA_MH/9975215025' as employee_name from dual
)
select employee_name , 
TRIM(SUBSTR(upper(A4.employee_name),1,INSTR(A4.employee_name,'/',1,1)-1)) AS employee_name1,
  TRIM(SUBSTR(upper(A4.employee_name),INSTR(A4.employee_name,'/',1,1)+1,INSTR(A4.employee_name,'_',1,1)-INSTR(A4.employee_name,'/',1,1)-1)) AS Country,
  TRIM(SUBSTR(upper(A4.employee_name),INSTR(A4.employee_name,'_',1,1)+1,INSTR(A4.employee_name,'/',1,2)-INSTR(A4.employee_name,'_',1,1)-1)) AS STATE,
  CASE WHEN REGEXP_COUNT(A4.employee_name,'_')>1 THEN 'WRONG_NAME>1_'
       WHEN REGEXP_COUNT(A4.employee_name,'/')>2 THEN 'WRONG_NAME>2/'
       WHEN TRIM(SUBSTR(upper(A4.employee_name),INSTR(A4.employee_name,'/',1,1)+1,INSTR(A4.employee_name,'_',1,1)-INSTR(A4.employee_name,'/',1,1)-1))NOT IN
         ('INDIA','NEPAL') THEN 'WRONG_COUNTRY'
       ELSE 'CORRECT' END AS VALIDATION

       from A4

在Postgres的帮助下,我可以将其转换为以下部分。

with A4 as 
(
select 'govinda j/INDIA_MH/9975215025'::text as employee_name
)
select employee_name,
       split_part(employee_name, '/', 1) as employee_name1,
       split_part(split_part(employee_name, '/', 2), '_', 1) as country,
       split_part(split_part(employee_name, '/', 2), '_', 2) as state
from A4

但是验证部分原因是无法转换。非常感谢任何帮助,因为我们是Postgres的新手。

1 个答案:

答案 0 :(得分:3)

您可以创建一个自定义函数:

java -Xmx$MEMORY -ea -Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -classpath "$cp" $CLASS "$@"

使用:

create or replace function number_of_chars(text, text)
returns integer language sql immutable as $$
    select length($1) - length(replace($1, $2, ''))
$$; 

请注意,上述函数仅计算字符串中某个字符的出现次数,而不使用正则表达式,这通常会更昂贵。

相当于with example(str) as ( values ('a_b_c'), ('a___b'), ('abc') ) select str, number_of_chars(str, '_') as count from example str | count -------+------- a_b_c | 2 a___b | 3 abc | 0 (3 rows) 的Postgres可能看起来像这样:

regexp_count()