从Oracle 12c中的对象数组中提取特定值

时间:2018-02-08 07:19:21

标签: arrays json regex oracle serialization

我绝不是开发人员,但我有一些技巧可以拼凑脚本并让它们工作。但是以下似乎远离了我的球场。

我必须在Oracle 12c中的VARCHAR2字段内处理以下内容:

<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
<script src="https://code.highcharts.com/highcharts.js"></script>
<script src="https://code.highcharts.com/modules/exporting.js"></script>

<div id="container" style="min-width: 310px; height: 400px; margin: 0 auto"></div>

我最初认为这是JSON,但我认为这可能只是对象的序列化表示。

无论如何,我需要提取存储在名称等于{ "channel": "Email", "events": [ { "attributes": [ { "isSync": false, "name": "reportId", "type": "number", "value": "87654321" }, { "isSync": false, "name": "subjectLine", "type": "string", "value": "Bla bla subject line" }, { "isSync": false, "name": "messageName", "type": "string", "value": "bla bla message name" }, { "isSync": false, "name": "docType", "type": "string", "value": "html" }, { "isSync": false, "name": "eventId", "type": "string", "value": "kTZA01zahw==" } ], "code": "emailOptOut", "namespace": null, "timestamp": "2018-01-25T09:21:48.085Z", "version": null } ], "identifiers": [ { "isOriginal": true, "name": "ENCODED_RECIPIENT_ID", "value": "Njc5MjM1MS1" }, { "isOriginal": true, "name": "Email", "value": "foo@bar.com" } ], "provider": "Provider", "source": "Source", "version": "1", "Id": "aa-bb-cc-dd"} 的标识符数组中的电子邮件地址("value": "foo@bar.com")的值。

我尝试使用"name": "Email"json_value对其进行解析,但失败了,因为我无法提取密钥为json_query的值。此外,期望值并不总是存储在相同的索引位置,因此我也不能以这种方式定位它。

然后我继续尝试使用Email,但经过大量搜索StackOverflow和Google后,我找不到任何可以帮助我做到这一点的正则表达式。不幸的是,我完全不了解正则表达式,因此我不得不复制并粘贴并尝试在那里失败。

注意:理想情况下,我可以在SQL语句中运行它,就像视图一样,因为我需要将解析后的数据用作其他内容的起点。

有关如何做到这一点的任何建议?

谢谢!

2 个答案:

答案 0 :(得分:0)

您可以使用'n'的match_parameter REGEXP_SUBSTR,它允许句点(。)(match-any-character字符)与newline字符匹配。

\s* - 匹配0个或更多空格

.+ - 匹配1个或多个字符,所以

(。+@.+.com) - 匹配表单<foo>@<bar.com>的电子邮件ID。

SELECT REGEXP_SUBSTR (
          col1,
          '"identifiers":.+"name"\s*:\s*"Email".+"value"\s*:\s*"(.+@.+.com)"',
          1,
          1,
          'n',
          1)
  FROM yourtable;

DEMO

答案 1 :(得分:0)

如果还不太晚,请使用

之类的东西
select jt.*
from (
select '{
"channel": "Email",
"events": [
    {
        "attributes": [
            {
                "isSync": false,
                "name": "reportId",
                "type": "number",
                "value": "87654321"
            },
            {
                "isSync": false,
                "name": "subjectLine",
                "type": "string",
                "value": "Bla bla subject line"
            },
            {
                "isSync": false,
                "name": "messageName",
                "type": "string",
                "value": "bla bla message name"
            },
            {
                "isSync": false,
                "name": "docType",
                "type": "string",
                "value": "html"
            },
            {
                "isSync": false,
                "name": "eventId",
                "type": "string",
                "value": "kTZA01zahw=="
            }
        ],
        "code": "emailOptOut",
        "namespace": null,
        "timestamp": "2018-01-25T09:21:48.085Z",
        "version": null
    }
],
"identifiers": [
    {
        "isOriginal": true,
        "name": "ENCODED_RECIPIENT_ID",
        "value": "Njc5MjM1MS1"
    },
    {
        "isOriginal": true, 
        "name": "Email",
        "value": "foo@bar.com"
    }
],
"provider": "Provider",
"source": "Source",
"version": "1",
"Id": "aa-bb-cc-dd"}' js 
from dual)d,
json_table(d.js, '$.identifiers[*]' columns(name varchar2(20) path '$.name', value varchar2(20) path '$.value' ))jt
where name = 'Email'
相关问题