2

JSON データフィールドをサポートする MYSQL 5.7.11 を使用しています。

製品の価格履歴を保存するテーブルの 1 つに JSON フィールドがあります。

JSON 構造 サンプル:

[{"da": "2016-05-03 08:32", "pr":15.90}] 
[{"da": "2016-03-22 09:02", "pr":14.40}]
[{"da": "2016-03-15 12:08", "pr":40.00}, {"da": "2016-06-28 10:32", "pr":42.00}]
[{"da": "2016-03-29 02:39", "pr":13.90}]
[{"da": "2016-05-03 08:38", "pr":17.90},{"da": "2016-07-19 10:18", "pr":26.80},{"da": "2016-07-19 14:20", "pr":24.80}]

ご覧のとおり、行内に複数の JSON 配列を含めることができます。サンプルの各 JSON 行は、異なる製品を表しています。最初の ROW の価格 15.90 は APPLE、2 番目の ROW 14.40 は ORANGE、3 番目の 40.00 と 42.00 は BANANA です。これを明確にするためだけに。

私が探しているのは、日付の範囲を検索できるようにすることです。

日付 A から日付 B までのすべての製品の価格履歴を取得するようにします。

テスト目的で、次のようなことを試みました。

select json_extract(json_price_history, '$.pr')=13.90 from products

しかし、常に NULL だけで多くの行が返されました。

どんな助けでも大歓迎です...

4

1 に答える 1

2

JsonPath。

クエリの jsonpath は、JSON ディクショナリから pr という名前の要素を抽出しようとしています。ただし、テーブルには辞書が含まれていません。各要素が辞書である配列があります。したがって、クエリは次のように変更する必要があります。

SELECT JSON_EXTRACT(DICT, '$[*].pr') FROM myjson;

これにより、次のようなものが表示されます。

+---------------------------------------------+
| JSON_UNQUOTE(JSON_EXTRACT(DICT, '$[*].pr')) |
+---------------------------------------------+
| NULL                                        |
| [15.9]                                      |
| [14.4]                                      |
| [40, 42]                                    |
| [13.9]                                      |
| [17.9, 26.8, 24.8]                          |
+---------------------------------------------+

RDBMS への配列の格納

配列を RDBMS に格納することはまったく問題ありません。ただし、これらの配列で何かを検索する必要がある場合は、データベースの設計が間違っていることを意味します。これはmysqlのドキュメントで明示的に言及されているのを見たことがありませんが、[より高度なjsonと配列のサポート][1]が得られるpostgreqlは、これについて非常に明確です。

ヒント: 配列はセットではありません。特定の配列要素の検索は、データベースの設計ミスの兆候である可能性があります。配列要素となる項目ごとに 1 つの行を持つ個別のテーブルを使用することを検討してください。これにより、検索が容易になり、多数の要素に対してより適切にスケーリングされる可能性があります。

于 2016-07-23T14:01:10.550 に答える