Oracle SQL文本提取:获取MY_WALLET_DIRECTORY对应值,无则返回NULL
问题描述
我有一列数据,内容如下:
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST="test1.zurich.com")(PORT=1521)) (CONNECT_DATA=(SERVICE_NAME=apps_test1.zurich.com)) (SECURITY=(MY_WALLET_DIRECTORY="/u01/zurich/Fdbb48380hdsvh8/data/zurich_WALLET_DIR") (SSL_SERVER_DN_MATCH=FALSE)))
我需要从这段内容中仅提取zurich_WALLET_DIR,如果MY_WALLET_DIRECTORY不存在则返回NULL。我尝试了下面的SQL语句但没成功,请求帮忙:
SELECT REGEXP_REPLACE(HOST,'(.*)(MY_WALLET_DIRECTORY)[[:blank:]]*="[[:blank:]]*([^\)]+*)\".*','\3',1,1,'i') FROM test;
问题原因
你的正则表达式存在两个关键问题:
[^\)]+*是无效语法,+和*都是正则量词,不能叠加使用;- 即便语法修正,当前正则提取的是
MY_WALLET_DIRECTORY对应的完整路径,而非你需要的路径末尾的zurich_WALLET_DIR。
解决方案
以下两种写法都能满足需求:
写法一:分步提取(逻辑更直观)
SELECT CASE WHEN REGEXP_LIKE(HOST, 'MY_WALLET_DIRECTORY', 'i') THEN REGEXP_SUBSTR(REGEXP_SUBSTR(HOST, 'MY_WALLET_DIRECTORY\s*=\s*"([^"]+)"', 1, 1, 'i', 1), '[^/]+$') ELSE NULL END AS WALLET_DIR_NAME FROM test;
写法二:单正则直接提取
SELECT REGEXP_SUBSTR(HOST, 'MY_WALLET_DIRECTORY\s*=\s*".*/([^"/]+)"', 1, 1, 'i', 1) AS WALLET_DIR_NAME FROM test;
用法说明
- 两种写法都会在
MY_WALLET_DIRECTORY不存在时返回NULL; \s*用于匹配=前后可能存在的任意空白字符;[^"]+精准匹配双引号内的完整路径内容;[^/]+$捕获路径中最后一个/之后的所有字符,即目标目录名;'i'参数表示忽略大小写,确保匹配不同大小写形式的MY_WALLET_DIRECTORY。
内容的提问来源于stack exchange,提问作者Zurich
相关产品推荐
相关产品推荐

