код plsql для анализа JSON без использования сторонних библиотек - PullRequest
0 голосов
/ 16 апреля 2019

JSON необходимо анализировать с использованием только кода PL / SQL, такого как регулярные выражения, чтобы извлечь из него значения sentiment и confidence.

Что-то похожее на это

[
   {
      "sentiment":"negative",
      "confidence":0.6211975044276729
   },
   {
      "sentiment":"neutral",
      "confidence":0.3510681601407111
   },
   {
      "sentiment":"positive",
      "confidence":0.027734335431616075
   }
]

выше JSON необходимо проанализировать, чтобы получить sentiment и confidence значения из него

Ответы [ 2 ]

3 голосов
/ 16 апреля 2019

Функция JSON_TABLE доступна начиная с Oracle Database 12c Release 1 (12.1.0.2).

SET NUMWIDTH 20 --Use this if SQL*Plus/ SQL developer truncates digits.

--test data
WITH t ( json_col ) AS ( SELECT '[
   {
      "sentiment":"negative",
      "confidence":0.6211975044276729
   },
   {
      "sentiment":"neutral",
      "confidence":0.3510681601407111
   },
   {
      "sentiment":"positive",
      "confidence":0.027734335431616075
   }
]'
  FROM dual
) --test data ends
SELECT j.*
FROM t
CROSS JOIN
     JSON_TABLE ( json_col,'$[*]'
          COLUMNS (
               sentiment  VARCHAR2(20) PATH '$.sentiment',
               confidence NUMBER       PATH '$.confidence'
          )
     )
j;


SENTIMENT                      CONFIDENCE
-------------------- --------------------
negative                .6211975044276729
neutral                 .3510681601407111
positive              .027734335431616075
0 голосов
/ 16 апреля 2019

Если вы действительно не хотите использовать какие-либо встроенные функции JSON, и ваш ввод не включает вложенных объектов, вы можете использовать SQL с рекурсивным предложением факторинга подзапроса:

Установка Oracle :

CREATE TABLE test_data ( json ) AS
SELECT '[
   {
      "sentiment":"negative",
      "confidence":0.6211975044276729
   },
   {
      "confidence":0.3510681601407111,
      "sentiment":"neutral"
   },
   {
      "sentiment":"positive",
      "confidence":0.027734335431616075
   }
]' FROM DUAL

Запрос

WITH rsqfc ( json, obj, lvl, cnt ) AS (
  SELECT json,
         REGEXP_SUBSTR( json, '\{(.*?)\}', 1, 1, 'n' ),
         1,
         REGEXP_COUNT( json, '\{(.*?)\}', 1, 'n' )
  FROM   test_data
  WHERE  REGEXP_COUNT( json, '\{(.*?)\}', 1, 'n' ) > 1
UNION ALL
  SELECT json,
         REGEXP_SUBSTR( json, '\{(.*?)\}', 1, LVL + 1, 'n' ),
         lvl + 1,
         cnt
  FROM   rsqfc
  WHERE  lvl < cnt
)
SELECT REGEXP_SUBSTR( obj, '"sentiment":\s*"(negative|neutral|positive)"', 1, 1, 'n', 1 ) AS sentiment,
       TO_NUMBER( REGEXP_SUBSTR( obj, '"confidence":\s*(\d+(\.\d*)?)', 1, 1, 'n', 1 ) ) AS confidence
FROM   rsqfc

выход

SENTIMENT |          CONFIDENCE
:-------- | ------------------:
negative  |   .6211975044276729
neutral   |   .3510681601407111
positive  | .027734335431616075

PL / SQL

Или с использованием PL / SQL:

DECLARE
  json CLOB := '[
   {
      "sentiment":"negative",
      "confidence":0.6211975044276729
   },
   {
      "confidence":0.3510681601407111,
      "sentiment":"neutral"
   },
   {
      "sentiment":"positive",
      "confidence":0.027734335431616075
   }
]';
  cnt PLS_INTEGER;
  obj VARCHAR2(4000);
  sentiment VARCHAR2(20);
  confidence NUMBER;
BEGIN
  cnt := REGEXP_COUNT( json, '\{(.*?)\}', 1, 'n' );
  FOR i IN 1 .. cnt LOOP
    obj        := REGEXP_SUBSTR( json, '\{(.*?)\}', 1, i, 'n' );
    sentiment  := REGEXP_SUBSTR( obj, '"sentiment":\s*"(negative|neutral|positive)"', 1, 1, 'n', 1 );
    confidence := TO_NUMBER( REGEXP_SUBSTR( obj, '"confidence":\s*(\d+(\.\d*)?)', 1, 1, 'n', 1 ) );
    DBMS_OUTPUT.PUT_LINE( sentiment || ' - ' || confidence );
  END LOOP;
END;
/

выход

dbms_output:
negative - .6211975044276729
neutral - .3510681601407111
positive - .027734335431616075

дБ <> скрипка здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...