Как я могу сравнить данные в массиве строк, который находится в одном столбце таблицы, с данными JSON в другом столбце таблицы?

#mysql #sql #arrays #json #where-clause

#mysql #sql #массивы #json #where-предложение

Вопрос:

Мне трудно справиться со всеми его сложностями. Для ответа на этот вопрос у меня есть таблица с двумя столбцами. Один столбец с именем names содержит такие данные:

 ["Marc", "Teddy", "Katie"]
 

Второй столбец содержит данные JSON, подобные этому:

 {"males":[{"name":"Marc","age":"32"},{"name":"Teddy","age":"8"}], 
 "females":[{"name":"Katie","age":"28"}]}
 

Есть ли способ в SQL сравнить строки в массиве в первом столбце с полем name в данных JSON во втором столбце, чтобы приписать поле age в JSON строкам name в первом столбце?

Я понимаю, что это сложная / запутанная ситуация, но любая помощь в извлечении данных из массива внутри столбца или извлечении данных из JSON в столбце была бы очень полезна для меня, пока я работаю над этим.

Ответ №1:

Кажется, что вам нужно JSON_CONTAINS() вместе с JSON_EXTRACT() функцией, чтобы сравнить эти столбцы, такие как

 WITH t(col1,col2) AS
(
 SELECT '["Marc", "Teddy", "Katie"]', 
        '{"males":[{"name":"Marc","age":"32"},{"name":"Teddy","age":"8"}], "females":[{"name":"Katie","age":"28"}]}'
)
SELECT JSON_EXTRACT(col2,'$.males[*].name') AS males,
       JSON_EXTRACT(col2,'$.females[*].name') AS females
  FROM t
 WHERE JSON_CONTAINS(col1,JSON_EXTRACT(col2,'$.males[*].name'))
    OR JSON_CONTAINS(col1,JSON_EXTRACT(col2,'$.females[*].name'))
 

Demo