postgresql - postgres 中的 REGEXP_COUNT

标签 postgresql postgresql-9.3

我们正在从 Oracle 迁移到 Postgres。

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

但现在我不确定如何执行 regex_count 部分。 甲骨文数据库

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 的新手。

最佳答案

您可以创建自定义函数:

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)

请注意,上述函数仅计算字符串中某个字符的出现次数,并未使用正则表达式,正则表达式通常开销更大。

regexp_count() 的 Postgres 等价物可能如下所示:

create or replace function regexp_count(text, text)
returns integer language sql as $$
    select count(m)::int
    from regexp_matches($1, $2, 'g') m
$$; 

with example(str) as (
values 
    ('a_b_c'),
    ('a___b'),
    ('abc')
)

select str, regexp_count(str, '_') as single, regexp_count(str, '__') as double
from example

  str  | single | double 
-------+--------+--------
 a_b_c |      2 |      0
 a___b |      3 |      1
 abc   |      0 |      0
(3 rows)

关于postgresql - postgres 中的 REGEXP_COUNT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52424275/

相关文章:

sql - ORDER BY 取决于列类型

sql - 如何获取所选日期和前 n 天之间的所有日期列表?

sql - 确定分层路径的子计数

c# - 进程中的 pg_dump 未写入任何文件

arrays - 根据同一表中的两个键获取记录数组

sql - 使用 PostgreSQL 的交叉表查询中的计数和总和无效

ruby - ActiveRecord 值是字符串类型数字的列的平均值

ruby-on-rails - Ruby 和 PostgreSQL 单行模式

postgresql - Postgres SELECT * FROM table WHERE column-varchar = ="string-example"?

postgresql - 在任何地方连接 postgreSQL 和自动化时,密码 crypt 身份验证不支持错误