关于sql:在Oracle 12c的JSON_VALUE中使用特殊字符的问题

Issue with using special character in JSON_VALUE of Oracle 12c

我正在Oracle 12c上运行以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
DECLARE
           l_json CLOB;
           l_var varchar2(90);
BEGIN
           l_json := '{
                     "value>50": {
                       "id":"file",
                       "value":"55",
                       "popup": {
                         "menuitem": [{
                           "value":"New",
                           "onclick":"CreateNewDoc()"
                          },
                          {
                           "value":"Open",
                           "onclick":"OpenDoc()"
                          },
                          {
                           "value":"Close",
                           "onclick":"CloseDoc()"
                          }]
                        }
                      }
                    }'
;

    SELECT JSON_VALUE(l_json, '$.value>50.value') INTO l_var FROM dual;
    DBMS_OUTPUT.PUT_LINE('var: '||l_var);
END;

运行它时,出现以下错误:

Error report -
ORA-06550: line 17, column 47:
PL/SQL: ORA-40442: JSON path expression syntax error
ORA-06550: line 17, column 1:
PL/SQL: SQL Statement ignored
06550. 00000 - "line %s, column %s:\
%s"
*Cause: Usually a PL/SQL compilation error.
*Action:

我期望结果为:
var:55
有没有办法在JSON_VALUE中使用特殊字符?


文档说:

An object step is a period (.), sometimes read as"dot", followed by an object key (object property name) or an asterisk (*) wildcard, which stands for (the values of) all keys. A key must start with an uppercase or lowercase letter A to Z and contain only such letters or decimal digits (0-9), or else it must be enclosed in double quotation marks (").

因此,由于您的密钥包含字符>,这不是列出的允许字符之一,因此您需要通过将JSON路径更改为以下内容来引用它:

1
SELECT JSON_VALUE(l_json, '$."value>50".value') INTO l_var FROM dual;