我必须做一个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$')
我希望看到的结果是
LegalExpression |计数
这些只有4个表达式,我有130个搜索
答案 0 :(得分: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
;
答案 1 :(得分:0)
如果您希望公司只计算一个正则表达式,您可以执行以下操作:
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;
关于你的模式的一些注释:
(*)
是什么。你不需要任何东西,因为正则表达式在字符串中找到模式;他们不会从字符串的开头开始。.
是正则表达式中的一个特殊字符,基本上是任何单个字符。