0

我必须做一个 regexp_like 并列出超过 130 种不同的检查。

目前我正在获取表中匹配的所有字段。

但在结果表中,我只想要一个搜索列表和旁边的计数。

下边是

SELECT *
FROM company
WHERE REGEXP_LIKE (company_name, '(*)A. en P.$')
or REGEXP_LIKE (company_name, '(*)A.C.$')
or REGEXP_LIKE (company_name, '(*)GmbH$')
or REGEXP_LIKE (company_name, '(*)A/S$')

我想看到的结果是

法律表达 | 数数

这些只是我有 130 个要搜索的 4 个表达式

4

2 回答 2

1

你可以使用UNION ALL

SELECT '()A. en P.$' as reg, COUNT(*) AS cnt
FROM company 
WHERE REGEXP_LIKE (company_name, '()A. en P.$')
UNION ALL 
SELECT '()A.C.$' as reg, COUNT(*) AS cnt
FROM company 
WHERE REGEXP_LIKE (company_name, '()A.C.$') 
...

另一种方式:

WITH cte(reg) AS (
   SELECT '()A. en P.$' FROM dual UNION ALL
   SELECT '()A.C.$' FROM dual
   -- ...
)
SELECT cte.reg, COUNT(c.company_name) AS cnt
FROM company c
RIGHT JOIN cte
  ON  REGEXP_LIKE (c.company_name, cte.reg)
GROUP BY cte.reg
;
于 2018-01-22T16:07:57.950 回答
1

如果你想让一家公司只计算一个正则表达式,你可以这样做:

select (case when REGEXP_LIKE(company_name, '(*)A. en P.$') then '(*)A. en P.$'
             when REGEXP_LIKE(company_name, '(*)A.C.$') then '(*)A.C.$'
             when REGEXP_LIKE(company_name, '(*)GmbH$') then '(*)GmbH$'
             when REGEXP_LIKE(company_name, '(*)A/S$') then '(*)A/S$'
        end), count(*)
from company
group by (case when REGEXP_LIKE(company_name, '(*)A. en P.$') then '(*)A. en P.$'
               when REGEXP_LIKE(company_name, '(*)A.C.$') then '(*)A.C.$'
               when REGEXP_LIKE(company_name, '(*)GmbH$') then '(*)GmbH$'
               when REGEXP_LIKE(company_name, '(*)A/S$') then '(*)A/S$'
        end);

如果您想为每场比赛计算一家公司,那么这是一种方法:

with patterns(pattern) as (
      select '(*)A. en P.$' from dual union all
      select '(*)A.C.$' from dual union all
      select '(*)GmbH$' from dual union all
      select '(*)A/S$' from dual
     )
select p.pattern, count(*)
from company c join
     patterns p
     on regexp_like(c.company_name, p.pattern)
group by p.pattern;

关于您的模式的一些说明:

  • 我不确定是什么(*)。一开始你不需要任何东西,因为正则表达式会在字符串中找到模式;它们不是从字符串的开头开始的。
  • .是正则表达式中的特殊字符,基本上是任何单个字符。
于 2018-01-22T16:10:06.557 回答