Как создать регулярное выражение в формате * время Oracle с разделителями-минусами? - PullRequest
0 голосов
/ 13 января 2020

В моей таблице есть несколько столбцов. Наиболее важными в этом примере являются 2 из них. У меня есть следующая строка в строке БД:

+----+--------------------------------------------------------------------------------------+-------+
| id |                                         info                                         | value |  
+----+--------------------------------------------------------------------------------------+-------+
| 10 | {"userId":"550","start":"2020-01-10 14:07:29","end":"2020-01-10 14:07:34","count":4} |   123 |  
+----+--------------------------------------------------------------------------------------+-------+

Что я хочу сделать, это извлечь из этой строки start дату только тогда, когда другой столбец имеет точное значение и упорядочить его к этой извлеченной дате des c.

На первом шаге я уже пытался извлечь из строки только дату, но она не работает. Код следующий:

SELECT REGEXP_SUBSTR(info, '[0-9]{4}-[0-9]{2}-[0-9]{1,2} [0-9]{2}:[0-9]{2}:[0-9]{2}') "REGEXPR_SUBSTR" from my_table WHERE value = 123;

Дело в том, что это регулярное выражение работает, пока у меня нет минуса внутри. Я имею в виду - регулярное выражение для этого работает правильно [0-9]{4} - но если я добавлю минус, то это не так.

У меня есть Oracle 11g.

Ответы [ 3 ]

4 голосов
/ 13 января 2020

Используйте регулярное выражение [{,]\s*"start"\s*:\s*"((\\"|[^"])*)", чтобы найти пару ключ-значение с ключом start и значением в кавычках и извлечь первую группу захвата, чтобы найти значение.

Это найдет правильное значение для данного ключа независимо от того, был ли изменен порядок JSON.

Oracle Настройка :

CREATE TABLE test_data ( id, info, value ) AS  
SELECT 10, '{"userId":"550","start":"2020-01-10 14:07:29","end":"2020-01-10 14:07:34","count":4}', 123 FROM DUAL UNION ALL
SELECT 20, '{"count":1,"end":"2020-02-03 12:34:56","userId":"551","start":"2020-01-02 01:23:45"}', 456 FROM DUAL UNION ALL
SELECT 30, '{"userId":"552","otherData":"\"start\":\"1970-01-01 00:00:00\"","start":"1999-01-01 00:00:00","end":"2000-01-01 23:59:59","count":42}', 789 FROM DUAL

Запрос :

SELECT id,
       value,
       REGEXP_SUBSTR( info, '[{,]\s*"userId"\s*:\s*"((\\"|[^"])*)"', 1, 1, NULL, 1 )
         AS userID,
       TO_DATE(
         REGEXP_SUBSTR( info, '[{,]\s*"start"\s*:\s*"((\\"|[^"])*)"', 1, 1, NULL, 1 ),
         'YYYY-MM-DD HH24:MI:SS'
       ) AS start_dt,
       TO_DATE(
         REGEXP_SUBSTR( info, '[{,]\s*"end"\s*:\s*"((\\"|[^"])*)"', 1, 1, NULL, 1 ),
         'YYYY-MM-DD HH24:MI:SS'
       ) AS end_dt,
       REGEXP_SUBSTR( info, '[{,]\s*"count"\s*:\s*(\d+)', 1, 1, NULL, 1 )
         AS cnt
FROM   test_data;

Выход :

ID | VALUE | USERID | START_DT            | END_DT              | CNT
-: | ----: | :----- | :------------------ | :------------------ | :--
10 |   123 | 550    | 2020-01-10 14:07:29 | 2020-01-10 14:07:34 | 4  
20 |   456 | 551    | 2020-01-02 01:23:45 | 2020-02-03 12:34:56 | 1  
30 |   789 | 552    | 1999-01-01 00:00:00 | 2000-01-01 23:59:59 | 42 

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

0 голосов
/ 13 января 2020
SELECT REGEXP_REPLACE(info, 
                      '.*start":"(.*)","end".*',
                      '\1') "REGEXPR_SUBSTR" 
  FROM YOURTABLE
 WHERE CONDITIONS;

Может сработать для Вас, если Вы не возражаете, что для формата даты нет никаких указаний c regexp, И Вы уверены, что между ключевыми словами start и end нет никакой другой информации.

Обратите внимание, это жадное регулярное выражение, вы можете его настроить.

0 голосов
/ 13 января 2020

Я не уверен, какие у вас проблемы с регулярным выражением.

Но, возможно, вам стоит попробовать что-нибудь более читабельное.

SELECT regexp_replace('{"userId":"550","start":"2020-01-10 14:07:29","end":"2020-01-10 14:07:34","duration":4,"batchTotal":1}', '{"userId":"(.*?)","start":"(.*?)","end":"(.*?)","duration":([0-9]+),"batchTotal":([0-9]+)}','\2') from dual

Кроме того, вы можете извлечь различную часть информации, меняющей числа \ 1, \ 2, \ 3, \ 4, \ 5, в regexp_reaplce

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