Используйте регулярное выражение [{,]\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 <> скрипка здесь