Как я могу искать данные json в mysql?

avatar
Success Man
8 апреля 2018 в 06:28
128
2
0

У меня есть поле описания. Поле json

Содержимое поля описания выглядит следующим образом:

{
    "address": 
    {
        "street": "street 123", 
        "information": 
        {
            "province": "province 123",
            "regency": "regency 123", 
            "district": "district 123"
        }
    }, 
    "mobileNumber": "123"
}

Я хочу найти провинцию в данных json

Я пытаюсь так:

SELECT * FROM orders WHERE LOWER(JSON_EXTRACT(description, "$.address.information.province")) LIKE "%prov%"

Результат пустой

Как решить эту проблему?

Источник
A1Gard
8 апреля 2018 в 06:35
0

PROV в верхнем регистре :-?

Success Man
8 апреля 2018 в 06:44
0

@Mahdi Parsa Я обновляю свой вопрос

Joakim Danielson
8 апреля 2018 в 06:49
0

Like не должен быть чувствительным к регистру. Пробовали ли вы выполнить «SELECT JSON_EXTRACT(...»), чтобы увидеть, что возвращает сама функция?

Success Man
8 апреля 2018 в 07:07
0

@Joakim Danielsson Если поле не json, оно не чувствительно к регистру. Но если поле json, оно чувствительно к регистру. я должен был попробовать это

Ответы (2)

avatar
Nick
8 апреля 2018 в 06:49
1

Проблема в том, что ваш JSON недействителен. После

запятых быть не должно.
"district": "district 123", 

и

"mobileNumber": "123",

Если вы попробуете использовать действительный JSON, вы получите ожидаемый результат:

select json_extract('{ "address": { "street": "street 123",         "information": { "province": "province 123",  "regency": "regency 123",             "district": "district 123" } }, "mobileNumber": "123"}', '$.address.information.province')

"province 123"

Я создал db-fiddle, который отлично работает с вашими данными:

create table x (id int, description json);
insert into x values(1, '{    "address":     {        "street": "street 123",         "information":         {            "province": "province 123",            "regency": "regency 123",             "district": "district 123"         }    },     "mobileNumber": "123"}');
select * from x where json_extract(description, '$.address.information.province') like '%prov%'

Вывод

id  description
1   {"address": {"street": "street 123", "information": {"regency": "regency 123", "district": "district 123", "province": "province 123"}}, "mobileNumber": "123"} 
Success Man
8 апреля 2018 в 07:05
0

Я обновил свой вопрос. Посмотри на это. Это то же самое. Результат пустой

Nick
8 апреля 2018 в 07:10
0

Я не уверен, почему это должно быть, я попробовал простую db-fiddle, и она отлично работает.

Success Man
8 апреля 2018 в 14:14
0

Ваш запрос не использует lower. Попробуйте использовать lower. Это не работает. Мне нужно использовать lower

Joakim Danielson
8 апреля 2018 в 16:44
0

@SuccessMan, странно, что пример, предоставленный Ником, у меня отлично работал, с нижним и без него.

Success Man
8 апреля 2018 в 23:46
0

@Joakim Danielson Было ли у вас изменение province 123 на Province 123, прежде чем попробовать?

Nick
9 апреля 2018 в 01:27
0

@SuccessMan Я обновил db-fiddle, чтобы использовать более низкий уровень, и он все еще работает нормально.

Nick
9 апреля 2018 в 01:30
0

@JoakimDanielson Причина, по которой мой запрос не нуждался в меньшем, заключалась в том, что данные и сравниваемая вещь были написаны строчными буквами. Я обнаружил то же самое, что данные JSON должны быть в одном и том же случае, чтобы LIKE работал (что странно...), попробуйте поиграть со скрипкой, установив для строки LIKE значение '%PROV%', и вы увидите, что это не так. t совпадают (независимо от того, на месте ли нижняя или нет)

avatar
r0ad
8 апреля 2018 в 06:56
-1

три вещи:

1.при использовании функции mysql 'JSON_EXTRACT', убедитесь, что тип данных 'json';

2.что-то не так с вашими данными json.удалены 2 запятые.правильный json должен быть таким:

{"address": {
    "street": "street 123",
    "information": {
        "province": "province 123",
        "regency": "regency 123",
        "district": "district 123"
    }
},
"mobileNumber": "123"}

3.чувствительно к регистру. попробуйте использовать это:

SELECT * FROM orders WHERE JSON_EXTRACT(description, "$.address.information.province") LIKE "%prov%"