You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 16:39:59