MariaDBでは、JSON_CONTAINS()
は、指定された値が特定のJSONドキュメントにあるのか、ドキュメント内の特定のパスにあるのかを確認できる組み込み関数です。
1
を返します 値が含まれている場合は、0
そうでない場合は、NULL
引数のいずれかがNULL
の場合 。
構文
構文は次のようになります:
JSON_CONTAINS(json_doc, val[, path])
json_doc
の場所 JSONドキュメント、val
は検索する値であり、path
ドキュメント内のパスを指定するオプションの値。
例
実例を示します。
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS(@json_document, '{"name": "Wag"}');
結果:
+--------------------------------------------------+ | JSON_CONTAINS(@json_document, '{"name": "Wag"}') | +--------------------------------------------------+ | 1 | +--------------------------------------------------+
この場合、一致があり、結果は1
です。 。
次の例では、一致するものはありません:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS(@json_document, '{"name": "Woof"}');
結果:
+---------------------------------------------------+ | JSON_CONTAINS(@json_document, '{"name": "Woof"}') | +---------------------------------------------------+ | 0 | +---------------------------------------------------+
値は中括弧で囲まれていることに注意してください。
2番目の引数が無効な場合は次のようになります。
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS(@json_document, 'Wag');
結果:
+--------------------------------------+ | JSON_CONTAINS(@json_document, 'Wag') | +--------------------------------------+ | NULL | +--------------------------------------+ 1 row in set, 1 warning (0.000 sec)
警告を見てみましょう:
SHOW WARNINGS;
結果:
+---------+------+-----------------------------------------------------------------------------------+ | Level | Code | Message | +---------+------+-----------------------------------------------------------------------------------+ | Warning | 4038 | Syntax error in JSON text in argument 2 to function 'json_contains' at position 1 | +---------+------+-----------------------------------------------------------------------------------+
パスを指定
オプションで、3番目の引数を使用してパスを指定できます。
例:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS(@json_document, 10, '$.weight');
結果:
+-----------------------------------------------+ | JSON_CONTAINS(@json_document, 10, '$.weight') | +-----------------------------------------------+ | 1 | +-----------------------------------------------+
パスを指定するときは、中かっこを使用する必要はありませんでした。
文字列を検索するものは次のとおりです:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS(@json_document, '"Wag"', '$.name');
結果:
+--------------------------------------------------+ | JSON_CONTAINS(@json_document, '"Wag"', '$.name') | +--------------------------------------------------+ | 1 | +--------------------------------------------------+
一重引用符の中に二重引用符を使用していることに注意してください。二重引用符を省略すると、次のようになります。
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS(@json_document, 'Wag', '$.name');
結果:
+------------------------------------------------+ | JSON_CONTAINS(@json_document, 'Wag', '$.name') | +------------------------------------------------+ | NULL | +------------------------------------------------+ 1 row in set, 1 warning (0.000 sec)
警告を確認しましょう:
SHOW WARNINGS;
結果:
+---------+------+-----------------------------------------------------------------------------------+ | Level | Code | Message | +---------+------+-----------------------------------------------------------------------------------+ | Warning | 4038 | Syntax error in JSON text in argument 2 to function 'json_contains' at position 1 | +---------+------+-----------------------------------------------------------------------------------+
ネストされた構造
ネストされたドキュメント内で値を検索する例を次に示します。
SET @json_document = '{ "name": "Wag", "specs": { "weight": 10, "height": 30 } }';
SELECT JSON_CONTAINS(@json_document, 30, '$.specs.height');
結果:
+-----------------------------------------------------+ | JSON_CONTAINS(@json_document, 30, '$.specs.height') | +-----------------------------------------------------+ | 1 | +-----------------------------------------------------+
ヌル引数
引数のいずれかがNULL
の場合 、結果はNULL
です :
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT
JSON_CONTAINS(null, 10, '$.weight') AS a,
JSON_CONTAINS(@json_document, null, '$.weight') AS b,
JSON_CONTAINS(@json_document, 10, null) AS c;
結果:
+------+------+------+ | a | b | c | +------+------+------+ | NULL | NULL | NULL | +------+------+------+
パラメータカウントが正しくありません
引数を指定しないとエラーが発生します:
SELECT JSON_CONTAINS();
結果:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_CONTAINS'
提供する引数が多すぎる場合も同じです:
SELECT JSON_CONTAINS('{ "a": 1}', 1, 2, 3);
結果:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_CONTAINS'