Почему подстановочный знак JSON_EXTRACT с LIKE% или%LIKE не работает в базе данных MySQL?

Мне нужно искать данные в таблице MYSQL с данными JSON. С помощью JSON_EXTRACT(@json, "$.link") LIKE '%http%' работает как положено. Но LIKE 'http%' or '%http' dosn't!

Означает ли это, что JSON_EXTRACT не может быть использован при сопоставлении с одним подстановочным знаком?

ПРИМЕР:

Это мой JSON

set @json = '{"link": "https://www.google.com"}' ; 
select JSON_EXTRACT(@json, "$.link") like '%com'; 
-- returns 0

select JSON_EXTRACT(@json, "$.link") like 'http%' ; 
-- returns 0

select JSON_EXTRACT(@json, "$.link") like '%google%' ; 
select JSON_EXTRACT(@json, "$.link") like '%http%' ; 
select JSON_EXTRACT(@json, "$.link") like '%com%' ; 
-- returns 1 !

И вот пример в Fiddle: https://www.db-fiddle.com/f/7yPvfa2UZsZLdYSxdsnecx/0

2 ответа

Решение

JSON_EXTRACT все еще возвращает JSON. Он не возвращает "сырые" значения, хотя может создать такое впечатление, когда вы используете его для извлечения отдельного числа, поскольку способ представления числа JSON совместим с SQL. Это не относится к строкам.

Другими словами:

set @json = '{"link": "https://www.google.com"}' ; 

select JSON_EXTRACT(@json, "$.link"); 

возвращается "https://www.google.com" не https://www.google.com, и ваш LIKE должен учитывать двойные кавычки.

Чтобы преобразовать строку JSON в фактическую строку MySQL, используйте JSON_UNQUOTE(),

Пожалуйста, попробуйте это.JSON_UNQUOTE(JSON_EXTRACT(@json, '$.like')) LIKE '%com%'

Другие вопросы по тегам