ดูว่าอาร์เรย์ JSON ใน MySQL มีวัตถุที่มีคีย์เก็บวันที่ที่ระบุหรือไม่


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) ฉันจะต้องเพิ่ม Invididual 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คีย์ซ้อนอยู่ที่อื่น

ดังนั้นหากคุณมีทางออกที่แตกต่างฉันอยากรู้


เป็นตัวแปร - กำหนดความลึกสูงสุดของอาร์เรย์วันที่ - เลือก MAX (json_depth (ข้อมูล - >> '$ [*]. วันที่')), กว่าวงในการแยกโพรซีเดอร์ที่เก็บไว้ในตาราง temp - id และวันที่เลือก - เลือก id, json_extract ( data, "$ [0] .date") เป็น 'date' จากแอปพลิเคชัน, - เลือก id, json_extract ( data, "$ [1] .Date") เป็น 'date' จากแอปพลิเคชันและอื่น ๆ กว่าใช้ตัวกรองทั้งหมด และมีรายการ id
a_vlad

คุณให้เบาะแสกับฉันเกี่ยวกับวิธีใช้ไวยากรณ์ json_contain
Jimmy Ilenloa
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.