在单个DB2查询中使用多个REGEXP_LIKE语句

yqlxgs2m  于 2022-11-07  发布在  DB2
关注(0)|答案(1)|浏览(406)

我试图理解一个非结构化字段的内容。我可以用多个查询来完成这个任务,但是我很难写一个查询,它可以把我需要的所有东西都拉到一个简洁的数据集中。
下面是一个人为的示例:

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的能力,因为我打算考虑多种数据类型。

4smxwvx5

4smxwvx51#

正如nfgl在他注解中提到的,您的查询将对每一行进行计数。

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
    END) AS PRODUCT_COUNT,
    COUNT(CASE
      WHEN REGEXP_LIKE(A.DATA, '[a-zA-Z]{3,}\.(com|net)\/[a-z0-9]+') THEN 1
    END) AS URL_COUNT
FROM TABLE AS A;

如果与CASE不匹配,则NULL是case的结果,因此您不需要ELSE

相关问题