MySQL의 JSON 배열에 키에 특정 날짜가있는 객체가 포함되어 있는지 확인


18

JSON 배열 내에 특정 날짜가 포함 된 행이 있는지 확인하려고합니다.

내 데이터가 다음과 같다고 가정 해 봅시다.

테이블 어플리케이션 :

id | application_id | data
# Rows
1 | 1 | [{"data" : ["some", "data#1"], "date": "2016-04-21"}, {"data" : ["other", "data#1"], "date" : "2016-04-22"}]
2 | 2 | [{"data" : ["some", "data#2"], "date": "2016-04-21"}, {"data" : ["other", "data#2"], "date" : "2016-04-26"}]
3 | 1 | [{"data" : ["some", "data#3"], "date": "2016-04-22"}, {"data" : ["other", "data#3"], "date" : "2016-04-26"}]
4 | 3 | [{"data" : ["some", "data#4"], "date": "2016-04-26"}]

데이터에 날짜가 포함 된 모든 응용 프로그램을 어떻게 찾을 수 '2016-04-26'있습니까?

그래서 기본적으로 나는 이것을 할 수 있습니다 :

select id, json_extract(`data`, "$[*].date") from applications

다음을 반환합니다 :

1 | ["2016-04-21", "2016-04-22"]
2 | ["2016-04-21", "2016-04-26"]
3 | ["2016-04-22", "2016-04-26"]
4 | ["2016-04-26"]

그러나 절 json_extract에서 사용하려고하면 다음과 같이 경로 인수 WHERE에서 배열의 키를 명시 적으로 말한 경우에만 사용할 수 있습니다 json_extract.

select * from applications where json_extract(`data`, "$[0].date") = "2016-04-26"

ID 4의 행을 올바르게 반환합니다.

그러나 경로에 와일드 카드를 사용하려고하면 더 이상 작동하지 않습니다.

select * from applications where json_extract(`data`, "$[*].date") = "2016-04-26"

이것은 2, 3, 4 행을 반환해야합니다.

다른 많은 옵션 / 변형을 시도했지만 쿼리를 올바르게 구성하는 방법을 찾지 못하는 것 같습니다.

현재 MySQL JSON 구현에서 이와 같은 것이 가능합니까?

답변:


15

Morgan Tucker-@morgo가 제공하는 한 가지 솔루션은 json_contains다음과 같이 사용하는 것입니다.

select * from applications where json_contains(`data`, '{"date" : "2016-04-26"}')

지금은 대답은 괜찮지 만 성능 문제가 있고 약간 해킹을 느낀다고 생각합니다 (다음 쿼리 참조).

날짜 범위 (에서 2016-04-24까지 2016-04-26) 를 쿼리 해야하는 경우 다음 json_contains과 같이 시간 범위에서 각 날짜에 대한 개별 정보를 추가해야합니다 .

select * from applications where json_contains(`data`, '{"date" : "2016-04-26"}') or json_contains(`data`, '{"date" : "2016-04-25"}') or json_contains(`data`, '{"date" : "2016-04-24"}')

그리고 date다른 곳에 키가 중첩되어 있으면 유효하지 않은 데이터를 반환 합니다.

다른 해결책이 있다면 알고 싶습니다.


변형으로-최대 날짜 심도 배열 정의-SELECT MAX (json_depth (data->> '$ [*]. date')), 저장 프로 시저 추출의 루프를 임시 테이블로 추출-id 및 선택한 날짜-id 선택, data응용 프로그램에서 '날짜'로 json_extract ( , "$ [0] .date")를 선택하고 응용 프로그램에서 ID를 선택하고 json_extract ( data, "$ [1] .date")를 응용 프로그램에서 '날짜'로 선택하십시오. 그리고 id의 목록을 가지고
a_vlad

json_contains 문법 사용법에 대한 힌트를 주셨습니다
Jimmy Ilenloa
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.