regex - 如何使用 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的样本数据:
- 频道=ATM;电话=0123;msg_id=PACS00812 ; ustrd=U123
- 频道=位置;电话=9922;ustrd=U156
第二条记录没有msg_id,所以需要排除。
解决方案
此方法不使用 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 方法“更干净”。
推荐阅读
- jestjs - Automated browser testing with puppeter and jest
- python - Python cassandra更新语句错误'输入不匹配're'期待K_WHERE'?
- python - 逐行读取带有算术表达式的文本文件,计算并在新的文本文件中写入结果
- javascript - Req,File.Path 仍未定义,由于文档模糊,我正在使用 multer,我无法完全理解它?
- javascript - 在 goup 中按类选择所有复选框
- linux - 如何从 linux shell 循环字符串以获取模式?
- sql-server - SQL Server 存储过程中的批量插入错误:无法打开文件
- r - 括号内的标准差:Latex R
- dataweave - 从 Mule 4 的属性文件中读取 mule 变量
- firebase - Firebase 存储规则 - 如果路径已知,已注销的用户可以打开文档