首页 > 解决方案 > 如何使用 REGEXP_SUBSTR 排除空值

问题描述

如果子标记包含 %PACS% 之类的值,则以下语句从 MISC 列检索子标记msg_id的值。

SELECT REGEXP_SUBSTR(MISC, '(^|\s|;)msg_id = (.*?)\s*(;|$)',1,1,NULL,2) AS TRANS_REF FROM MISC_HEADER
WHERE MISC LIKE '%PACS%';

我注意到查询返回记录也带有空值(没有 msg_id)。任何想法是否可以从 REGEXP_SUBSTR 的语法中排除那些空记录,而无需添加任何 where 子句。

MISC的样本数据:

  1. 频道=ATM;电话=0123;msg_id=PACS00812 ; ustrd=U123
  2. 频道=位置;电话=9922;ustrd=U156

第二条记录没有msg_id,所以需要排除。

标签: regexoraclenullexpressionsubstr

解决方案


此方法不使用 REGEXP,因此可能不适合您。但是,它确实满足您的要求。这将获取您嵌入的 msg_id 列表,将其分解为每个组件的 ID 行(我假设您确实有一些东西可以唯一地标识每条记录)。然后它只返回原始行,其中 ID 的行之一中包含“PACS”。

WITH thedata
     AS (SELECT 1 AS theid
              , 'channel=atm ; phone=0123 ; msg_id=PACS00812 ; ustrd=U123'
                   AS msg_id
         FROM   DUAL
         UNION ALL
         SELECT 2, 'channel=pos; phone=9922; ustrd=U156' FROM DUAL)
   , mylist
     AS (SELECT theid, COLUMN_VALUE AS msg_component
         FROM   thedata
              , XMLTABLE(('"' || REPLACE(msg_id, ';', '","') || '"')))
SELECT *
FROM   thedata td
WHERE  EXISTS
          (SELECT 1
           FROM   mylist m
           WHERE  m.theid = td.theid
           AND    m.msg_component LIKE '%PACS%')  

数据子查询只是生成几条记录并伪装成您的表。您可以删除它并替换您的实际表名。还有其他方法可以分解嵌入列表,包括使用 REGEXP 的方法,我只是发现 XMLTABLE 方法“更干净”。


推荐阅读