我试图理解一个非结构化字段的内容。我可以用多个查询来完成这个任务,但是我很难写一个查询,它可以把我需要的所有东西都拉到一个简洁的数据集中。
下面是一个人为的示例:
UID DATA
832 9a4b98f8ffb8e8c972
833 NULL
834 ABG:02-642960
835 www.web.com/page2
836 Amazon Kindle
837 vrx:49275004
838 p=a7039&v=ann@web.net&x=page4
839 https://pme.net/app4
以下查询有效:
SELECT A.DATA AS PROD_CODES
FROM TABLE AS A
WHERE REGEXP_LIKE(A.DATA, '[a-zA-Z]{3}:+[0-9]{2,8}[\-[0-9]{6,8}]?', 'i');
以下是输出:
PROD_CODES
ABG:02-642960
vrx:49275004
我想知道的是:
ROW_COUNT PRODUCT_COUNT URL_COUNT
8 2 2
下面是我正在处理的查询:
SELECT COUNT(*) AS ROW_COUNT,
COUNT(CASE
WHEN REGEXP_LIKE(A.DATA, '[a-zA-Z]{3}:+[0-9]{2,8}[\-[0-9]{6,8}]?') THEN 1
ELSE 0 END) AS PRODUCT_COUNT,
COUNT(CASE
WHEN REGEXP_LIKE(A.DATA, '[a-zA-Z]{3,}\.(com|net)\/[a-z0-9]+') THEN 1
ELSE 0 END) AS URL_COUNT
FROM TABLE AS A;
它会传回:
ROW_COUNT PRODUCT_COUNT URL_COUNT
8 8 8
我将添加一条注解,即我需要使用REGEXP_LIKE
的能力,因为我打算考虑多种数据类型。
1条答案
按热度按时间4smxwvx51#
正如nfgl在他注解中提到的,您的查询将对每一行进行计数。
如果与CASE不匹配,则NULL是case的结果,因此您不需要ELSE