Oracle RegExp_Substr无法在引号

时间:2017-06-14 10:40:45

标签: sql json oracle oracle11g

我有一个JSON文件,如下所示。

"orderingCustomer":{
   "@class":"com.worldwide.sector",
   "option":"K",
   "addressLine1":"DYNAMIC OFFICE, STREET 2",
   "addressLine2":null,
   "addressLine3":null,
   "partyId":null,
   "partyName":"DYNAMIC LTD",
   "partyBic":null,
   "accountNumber":null
   }

My Query会解析此JSON,并根据逗号(,)作为分隔符返回行。

SELECT CAST( TRIM( REGEXP_SUBSTR( ( SELECT REPLACE( REGEXP_SUBSTR( DBMS_LOB.SUBSTR( SWIFT_DATA, 32000 ), '["]orderingCustomer["]:{[^}]+' ), '"orderingCustomer":"', '' )
                                       FROM TXN_SWIFT
                                      WHERE ID_TXN_SWIFT = 123 ),
                                   '[^,]+',
                                   1,
                                   3 ) ) AS VARCHAR2( 320 ) )
            TRANSTYPE
  FROM TXN_SWIFT_OUT_MSG
 WHERE MESSAGE_UUID = 12345;  

此查询工作正常,并根据分隔符(逗号)为每个关键字提供行方式结果。但是当我搜索“addressLine1”时,我遇到了问题,其结果显示为

"addressLine1":"DYNAMIC OFFICE

而不是

"addressLine1":"DYNAMIC OFFICE, STREET 2"

我尝试将正则表达式更改为显示的正则表达式

[,(?=(?:\[^"\]*"\[^"\]*")*\[^"\]*$)][1]

但即使将正则表达式从[^,]+替换为,(?=(?:\[^"\]*"\[^"\]*")*\[^"\]*$)

,我仍无法获得上述所需数据,如上所示

我甚至不再获得价值观。请建议,我的查询可能是什么。 (使用11g版本)

1 个答案:

答案 0 :(得分:0)

利用json语法:

"[^"]+":("[^"]+"|null)

基本上,这反映了在json中表示单个属性的语法。支持的类型是字符串并且为null。

在regex101

Test it

<强> 买者

此正则表达式不处理字符串内的双重引号的情况。以下修改解决了此问题:

"[^:]+?:("([^\\"]+(\\.)*)+"|null|true|false)

基本上,此模式将由双引号分隔的字符串解释为没有\"的字符串序列,这些字符串由转义字符序列分隔。该构造包括没有这样的转义字符的情况。 (附加文字涵盖布尔属性)。

在regex101

Test it

<强> 注意

请注意,不支持数组和对象作为属性值,但由于原始模式显然也不考虑它们,因此这似乎不是您的要求的一部分。     请注意,如果可以的话,正则表达式匹配会很快变得讨厌,因为你必须在模式中提供递归(我甚至不确定oracle的正则表达式引擎是否支持)。