説明
この関数は、指定されたJSONドキュメントがターゲットJSONドキュメント内に含まれているか、またはターゲットドキュメントの指定されたパス上で指定された要素が見つかるかどうかを検証します(pathパラメータが指定されている場合)。指定されたJSONドキュメントがターゲットJSONドキュメント内に含まれている場合、この関数は1を返し、そうでない場合は0を返します。
指定されたパス内にデータが存在するかどうかのみを確認する必要がある場合は、JSON_CONTAINS_PATH()を代わりに使用してください。
構文
JSON_CONTAINS(target, candidate[, path])
説明
パラメータcandidateはJSONドキュメントを指定するために使用され、パラメータtargetはターゲットJSONドキュメントを表します。
いずれかのパラメータがNULLである場合、またはpathパラメータがターゲットドキュメントの一部として認識されない場合、NULLを返します。
以下の場合はすべてエラーが発生します:
candidateまたはtargetパラメータが有効なJSONドキュメントではありません。pathパラメータが有効なパス式ではありません。pathパラメータに*または**ワイルドカードが含まれています。
この関数は以下のルールに従います:
単一要素が等しいという前提は、2つのスカラー値のJSON_TYPE()が同じで比較可能であることです。数値型の場合は、直接比較できます。
配列については、
candidate配列のすべての要素がtarget配列に含まれている場合に限り、candidate配列はtarget配列に含まれていると言えます。オブジェクトについては、
candidateオブジェクトのすべてのkeyがtargetオブジェクトに含まれており、かつ各keyに対応するvalueもターゲットオブジェクトの対応するkeyと同じである場合に限り、candidateオブジェクトはtargetオブジェクトに含まれていると言えます。
例
obclient> SET @jn = '{"a": 1, "b": 2, "c": {"d": 4}}';
Query OK, 0 rows affected
obclient> SET @jn2 = '1';
Query OK, 0 rows affected
obclient> SELECT JSON_CONTAINS(@jn, @jn2, '$.a');
+---------------------------------+
| JSON_CONTAINS(@jn, @jn2, '$.a') |
+---------------------------------+
| 1 |
+---------------------------------+
1 row in set
obclient> SELECT JSON_CONTAINS(@jn, @jn2, '$.b');
+---------------------------------+
| JSON_CONTAINS(@jn, @jn2, '$.b') |
+---------------------------------+
| 0 |
+---------------------------------+
1 row in set
obclient> SET @jn2 = '{"d": 4}';
Query OK, 0 rows affected
obclient> SELECT JSON_CONTAINS(@jn, @jn2, '$.a');
+---------------------------------+
| JSON_CONTAINS(@jn, @jn2, '$.a') |
+---------------------------------+
| 0 |
+---------------------------------+
1 row in set
obclient> SELECT JSON_CONTAINS(@jn, @jn2, '$.c');
+---------------------------------+
| JSON_CONTAINS(@jn, @jn2, '$.c') |
+---------------------------------+
| 1 |
+---------------------------------+
1 row in set