чтение / поиск по JSON данным в MariaDB (несколько объектов в массивах: глубокий поиск - вопрос синтаксиса) - PullRequest
1 голос
/ 21 января 2020

У меня есть эта JSON структура в поле таблицы в базе данных MariaDB:

table column name: BcDJSON

{"placards":
     [
     {"barcode":"???","destination":"???","weight":"???"}, 
     {"barcode":"???","destination":"???","weight":"???"},
     {etc..}
    ]
}


мой sql текущий запрос выглядит так:

"SELECT * from table WHERE BcDJSON LIKE '%.$value.%'";

, но это не приводит к стабильному коду. Я попытался использовать JSON_EXTRACT, но просматривая объект в массиве объектов в MariaDB: я попробовал несколько вариантов - и чтение документов не ответило на мой вопрос. JSON_EXTRACT даже то, что я действительно хочу использовать здесь? Мне нужно вернуть всю строку - там, где в этой структуре JSON есть штрих-код.

синтаксис вещи, которые я пробовал: (??? = действительные значения)

SELECT * from datawork WHERE JSON_EXTRACT('BcDJSON', '$.barcode') = '???'
SELECT * from datawork WHERE JSON_EXTRACT('BcDJSON', '$.placards, $.barcode') = '???'
SELECT * from datawork WHERE JSON_EXTRACT('BcDJSON', '$.placards.$.barcode') = '???'
SELECT * from datawork WHERE JSON_EXTRACT('BcDJSON', '$.placards->$.barcode') = '???'
SELECT * from datawork WHERE JSON_EXTRACT('BcDJSON', '$.placards$.barcode') = '???'
SELECT * from datawork WHERE JSON_EXTRACT('BcDJSON', '$.placards') = '???'
SELECT * from datawork WHERE JSON_EXTRACT('BcDJSON', '$.placards', '$.barcode') = '???'
SELECT * from datawork WHERE JSON_EXTRACT('BcDJSON', '$.placards.barcode') = '???'


1 Ответ

1 голос
/ 21 января 2020

Вы должны использовать JSON_SEARCH, чтобы увидеть, можно ли найти значение в одном из значений barcode:

SELECT * 
FROM datawork
WHERE JSON_SEARCH(BcDJSON, 'one', '???', NULL, '$.placards[*].barcode') IS NOT NULL

Например:

CREATE TABLE datawork (id int auto_increment primary key,
                       BcDJSON TEXT);
INSERT INTO datawork (BcDJSON) values 
('{"placards":
     [
     {"barcode":"123","destination":"a","weight":"1"}, 
     {"barcode":"456","destination":"b","weight":"2"}
    ]
}'),
('{"placards":
     [
     {"barcode":"789","destination":"a","weight":"1"}, 
     {"barcode":"123","destination":"b","weight":"2"}
    ]
}');
SELECT * 
FROM datawork 
WHERE JSON_SEARCH(BcDJSON, 'one', '123',  NULL,'$.placards[*].barcode') IS NOT NULL

Вывод:

id  BcDJSON
1   {"placards": [ {"barcode":"123","destination":"a","weight":"1"}, {"barcode":"456","destination":"b","weight":"2"} ] }
2   {"placards": [ {"barcode":"789","destination":"a","weight":"1"}, {"barcode":"123","destination":"b","weight":"2"} ] }

Демонстрация на dbfiddle

...