У меня есть база данных MaraiDB (10.2.14), содержащая таблицу, в которой в одном столбце хранятся данные JSON.
Я озадачен тем, как извлечь данные из этого столбца.
Пример данных
SELECT 1 AS ID
, '[{"name":"x","score":2},{"name":"y", "score":8},{"name":"z","score":3}]' AS REPLY
UNION ALL
SELECT 2 AS ID
, '[{"name":"x","score":5},{"name":"y", "score":4},{"name":"z","score":3}]' AS REPLY
UNION ALL
SELECT 3 AS ID
, '[{"name":"x","score":2},{"name":"y", "score":2},{"name":"z","score":6}]' AS REPLY
UNION ALL
SELECT 4 AS ID
, '[{"name":"x","score":5},{"name":"y", "score":8},{"name":"z","score":6}]' AS REPLY
Итак, как мне найти все записи, имеющие «name»: «x» и «score»: 5.Кроме того, мне нужно получить значение "Score" для "name": "y" этой записи.
Мой текущий грязный подход -
WITH JT1 AS (
SELECT 1 AS ID
, '[{"name":"x","score":2},{"name":"y", "score":8},{"name":"z","score":3}]' AS REPLY
UNION ALL
SELECT 2 AS ID
, '[{"name":"x","score":5},{"name":"y", "score":4},{"name":"z","score":3}]' AS REPLY
UNION ALL
SELECT 3 AS ID
, '[{"name":"x","score":2},{"name":"y", "score":2},{"name":"z","score":6}]' AS REPLY
UNION ALL
SELECT 4 AS ID
, '[{"name":"x","score":5},{"name":"y", "score":8},{"name":"z","score":6}]' AS REPLY
)
SELECT ID
, REGEXP_REPLACE(
REGEXP_REPLACE( EXTRACTED, '^.*"y",\\s', '')
, '[,\\]].*$', '') AS Y
, EXTRACTED
FROM (
SELECT ID
, JSON_EXTRACT(REPLY, '$[*].name','$[*].score') EXTRACTED
FROM JT1
) JT2
WHERE EXTRACTED RLIKE '"x", 5\\b'
;
Так что я сначала извлекаю "name"и «оценка», которая дает мне данные столбца, такие как ["x", 5, "y", 4, "z", 3]
.После этого я делаю некоторые неприятные операции поиска и замены REGEXP.
Я чувствую, что должен быть лучший способ.
Я пытался использовать COLUMN_CREATE, но "COLUMN_CREATE", похоже, не может принять результатиз JSON_EXTRACT в качестве ввода.Теперь, когда я думаю об этом, это кажется логичным, поскольку «имя» и «счет» здесь правильно упорядочены, но могу ли я быть уверен, что это всегда та последовательность?
Может кто-нибудь дать мне подсказку, как сделать это лучше