MySQL'deki bir JSON dizisinin, anahtarı belirli bir tarihi olan bir nesne içerip içermediğine bakın


18

JSON dizisi içinde belirli bir tarih içeren bir satır olup olmadığını bulmaya çalışıyorum

Diyelim ki verilerim şöyle görünüyor:

Tablo uygulamaları:

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"}]

Verileri tarihi içeren tüm uygulamaları nasıl bulabilirim '2016-04-26'?

Temelde bunu yapabilirim:

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

Hangi döndürür:

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"]

Deneyin kullanmak Ama eğer json_extractiçinde WHEREmaddesi açıkça içinde dizinin anahtarı söylersen ben sadece bunu kullanabilirsiniz json_extractböylece gibi 'nın yol argüman:

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

4 numaralı satırı doğru döndürür.

Ama yolda bir joker karakter kullanmaya çalışırsam, artık çalışmaz:

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

bu satır 2, 3, 4'ü döndürmelidir.

Diğer birçok seçenek / varyasyon denedim ama doğru sorgu yapılandırmak için bir yol bulamıyorum.

MySQL JSON'un şu anki uygulamasıyla böyle bir şey mümkün mü?

Yanıtlar:


15

Morgan Tucker - morgo tarafından sağlanan bir çözüm şöyle kullanmaktır json_contains:

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

Şimdilik cevap tamam, ama bazı performans sorunları olabilir ve bana (bir sonraki sorguya bakınız) - biraz acayip hissediyor inanıyorum - ama ben oraya zaman ben ilgileneceğiz :)

Ben (bir tarih aralığını sorguya gerekir.Yemek 2016-04-24için 2016-04-26) Bir invididual eklemeniz gerekir json_containsşöyle bir süre içinde her gün için:

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"}')

Ve datebaşka bir yerde iç içe geçirilmiş bir anahtarım olursa bu geçersiz veriler döndürür

Farklı bir çözümünüz varsa, bilmek isterim


varyant olarak - maksimum tarih derinliği dizisini tanımla - SELECT MAX (json_depth (veri - >> '$ [*]. tarih')), saklı yordamdaki döngüden geçici tablolar - id ve seçilen tarih - id, Uygulamalardan data'tarih' olarak json_extract ( data, "$ [0] .date"), tüm filtreyi uygulamak yerine id'den json_extract ( , "$ [1] .date") vb. seçin. ve id listesi var
a_vlad

json_contains sözdizimini nasıl kullanacağınıza dair bir ipucu verdiniz
Jimmy Ilenloa
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.