MySQLのJSON配列に、特定の日付を保持するキーを持つオブジェクトが含まれているかどうかを確認します


17

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_extractWHERE句で使用しようとすると、次のように、配列のキーを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の現在の実装でもこのようなことが可能ですか?

回答:


14

Morgan Tuckerが提供する1つのソリューション-@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を選択する、 json_extract(data、 "$ [0] .date")をアプリケーションから 'date'として、選択-id、json_extract(data、 "$ [1] .date")をアプリケーションから 'date'などとして、すべてのフィルターを適用IDのリストがある
a_vlad

json_contains構文の使用方法に関する手がかりを教えてくれました
ジミーイレンロア
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.