SQL For JSON条件

SQL for JSON条件によって、次のようにJavaScript Object Notation (JSON)データをテストできます。

  • IS JSON条件によって、式が構文的に正しいJSONデータかどうかをテストできます。

  • JSON_EQUAL条件は、2つのJSON値が同じかどうかをテストします。

  • JSON_EXISTS条件によって、指定されたJSON値がJSONデータにあるかどうかをテストできます。

  • JSON_TEXTCONTAINS条件によって、指定された文字列がJSONプロパティ値にあるかどうかをテストできます。

JSON_condition::=

IS JSON条件

このSQL JSON条件を使用して、式が構文的に正しい整形式のJSONデータかどうかをテストします。

  • テストしたデータが構文的に正しく、キーワードVALIDATEが存在しない場合、IS JSONはtrueを戻し、IS NOT JSONはfalseを戻します。

  • キーワードVALIDATEが存在する場合、データは、指定されたJSONスキーマに関して整形式であることと有効であることの両方を確認するためにテストされます。キーワードVALIDATE (オプションでキーワードUSINGが続く)の後には、検証対象のJSONスキーマであるSQL文字列リテラルが後続している必要があります。

  • 解析または検証中にエラーが発生し、データが整形式でないか、有効でないとみなされた場合、IS JSONはfalseを戻し、IS NOT JSONはtrueを戻します。解析および検証エラーは、trueまたはfalseを戻す条件自体によって処理されます。解析と検証のどちらによるものでもない他のエラーの場合は、これらのエラーが発生します。

  • IS JSONおよびIS NOT JSONは、SELECT文のCASE式またはWHERE句で使用できます。IS JSONはチェック制約で使用できます。

is_JSON_condition::=

  • exprは、評価の対象となるJSONデータを指定するために使用します。テキスト・リテラルを評価する式を指定します。exprが列である場合、列のデータ型はVARCHAR2CLOBまたはBLOBのいずれかである必要があります。exprがnullまたは長さゼロのテキスト・リテラルを評価する場合、この条件はUNKNOWNを戻します。

  • exprがデータ・タイプBLOBの列の場合、FORMAT JSONを指定する必要があります。

  • STRICTを指定すると、この条件は厳密なJSON構文のみを整形式のJSONデータとみなします。LAXを指定すると、この条件は緩いJSON構文のみを整形式のJSONデータとみなします。デフォルトはLAXです。厳密なJSON構文および緩いJSON構文の詳細は、Oracle Database JSON開発者ガイドを参照してください。

  • WITH UNIQUE KEYSを指定すると、キー名が各オブジェクト内で一意である場合のみ、この条件は整形式のJSONデータとみなします。WITHOUT UNIQUE KEYSを指定すると、キー名がオブジェクト内で重複する場合、この条件は整形式のJSONデータとみなします。WITHOUT UNIQUE KEYSテストは、WITH UNIQUE KEYSテストより高速に実行されます。デフォルトはWITHOUT UNIQUE KEYSです。

  • データが指定のJSONスキーマに関して有効であることもテストするには、オプションのキーワードVALIDATEを指定します。

JSONスキーマ検証

JSONスキーマでは通常、他のJSONドキュメントの許可される構造とデータ型を指定します。したがって、JSONスキーマを使用してJSONデータを検証できます。次の方法でJSONスキーマに対してJSONデータを検証できます。

  • キーワードVALIDATEおよびJSONスキーマの名前を指定して条件IS JSON (またはIS NOT JSON)を使用して、ターゲット・データがそのスキーマに対して有効(または無効)であるかどうかをテストします。スキーマは、リテラル文字列または使用状況ドメインとして指定できます。(キーワードVALIDATEの後にはキーワードUSINGを指定することもできます)。

    条件is jsonのVALIDATEは、その条件が使用可能な任意の場所で使用できます。これには、WHERE句での使用やチェック制約としての使用が含まれ、これによって有効なデータのみが列に挿入されるようにします。

    JSON型の列のチェック制約として使用する場合は、is jsonを省略して、キーワードVALIDATEのみを直接使用することもできます。JSON型の列の場合、次の2つの表作成は同等です。

    CREATE TABLE tab (jcol JSON VALIDATE '{"type" : "object"}’);
    CREATE TABLE tab (jcol JSON CONSTRAINT jchk
      CHECK (jcol IS JSON VALIDATE '{"type" : "object"}’));
  • JSON型データのチェック制約として使用状況ドメインを使用します。次に例を示します。

    CREATE DOMAIN jd AS JSON CONSTRAINT jchkd CHECK (jd IS JSON VALIDATE '{"type" : "object"});
    CREATE TABLE jtab(jcol JSON DOMAIN jd);

    スキーマからドメインを作成する場合は、制約とis jsonを省略して、キーワードVALIDATEのみを直接使用することもできます。このドメイン作成は、前のものと同等です。

    CREATE DOMAIN jd AS JSON VALIDATE '{"type" : "object"};
  • バイナリJSON形式をサポートするデータベースでは、クライアントでデータをエンコードできます。このような場合、データベースはテキストJSONをバイナリ表現に変換する必要がないため、拡張データ型を使用した検証を実行できます。

    テキストJSONがデータベースに送信されると、それに続けてバイナリ表現へのエンコーディング・プロセスが実行されます(サーバー側エンコーディング)。こうした状況では、CASTモードでスキーマ・バリデータを操作できます。つまり、バイナリ・エンコーダは、JSONスキーマの拡張データ型キーワードに指定された値を使用し、スカラー・フィールドをバイナリ表現にエンコードできます。キャストの対象となるのはスカラー型のみです。

    CREATE TABLE jtab (
      id    NUMBER(9) PRIMARY KEY,
      jcol  JSON CHECK(jcol IS JSON VALIDATE CAST USING '{
                      "type": "object",
                      "properties": {
                           "firstName": {
                            "extendedType": "string",
                            "maxLength": 50
                          },
                          "birthDate" : {
                            "extendedType": "date"
                          }
                        },
                        "required": ["firstName", "birthDate"]
                      }'
      )
    );

    次のテキストJSONは、前述のスキーマごとに有効なドキュメントです:

    {
      "firstName": "Scott",
      "birthDate": "1990-04-02"
    }
  • 『JSON開発者ガイド』JSONスキーマで詳しく説明されているPL/SQLファンクションを使用します。

静的ディクショナリ・ビューDBA_JSON_SCHEMA_COLUMNSALL_JSON_SCHEMA_COLUMNSおよびUSER_JSON_SCHEMA_COLUMNSには、チェック制約として使用するJSONスキーマが記述されます。

これらのビューの各行には、JSONスキーマで定義された表、JSON列および制約の名前に加えてJSONスキーマ自体が含まれるとともに、JSONスキーマにキャスト・モードが指定されているかどうかが示されます。ビューDBA_JSON_SCHEMA_COLUMNSおよびALL_JSON_SCHEMA_COLUMNSには、表所有者の名前も含まれます。

IS JSON VALIDATE

次の例では、JSON検証チェックがあるJSON制約jtlisjを含むスキーマjsontab1が作成されます。

CREATE TABLE jsontab1(
    id NUMBER(4),
    j  JSON CONSTRAINT jt1isj CHECK (j IS JSON VALIDATE USING     
     '{
       "type":"object", 
       "minProperties": 2
      }')
    );

次の例は、JSONオブジェクト以外の値を挿入しようとしたときのエラーを示しています。

INSERT INTO jsontab1(j) VALUES ('["a", "b"]');
INSERT INTO jsontab1(j) VALUES ('["a", "b"]')
*
ERROR at line 1:
ORA-02290: check constraint (SYS.JT1ISJ) violated

次の2つの例は、有効な入力を使用して行が追加されたことを示しています。

INSERT INTO jsontab1(j) VALUES ('{"a": "a", "b": "b"}');

   1 row created.
 
INSERT INTO jsontab1(jschd) VALUES (json('"a json string"'));

1 row created.

次の例では、別の制約jschdsvが表jsontab1に追加されます。

ALTER TABLE jsontab1
ADD jschd JSON CONSTRAINT jschdsv
                   CHECK (jschd IS JSON VALIDATE USING '{"type":"string"}');

Table altered.
SQL> INSERT INTO jsontab1(jschd) VALUES (json('3.1415'));
INSERT INTO jsontab1(jschd) VALUES (json('3.1415'))
*
ERROR at line 1:
ORA-02290: check constraint (SYS.JSCHDSV) violated

WHERE句でのIS JSON VALIDATE

SELECT COUNT(1) FROM jsontab1 WHERE j IS JSON 
VALIDATE
         '{"type" : "object",
              "properties" : {
                  "id" : {
                      "type" : "number"
                   }
               }
           }';

厳密なJSON構文または緩いJSON構文のテスト: 例

次の文は、col1列を使用した表tを作成します。

CREATE TABLE t (col1 VARCHAR2(100));

次の文は、値を表tの列col1に挿入します。

INSERT INTO t VALUES ( '[ "LIT192", "CS141", "HIS160" ]' );
INSERT INTO t VALUES ( '{ "Name": "John" }' );
INSERT INTO t VALUES ( '{ "Grade Values" : { A : 4.0, B : 3.0, C : 2.0 } }');
INSERT INTO t VALUES ( '{ "isEnrolled" : true }' );
INSERT INTO t VALUES ( '{ "isMatriculated" : False }' );
INSERT INTO t VALUES (NULL);
INSERT INTO t VALUES ('This is not well-formed JSON data');

次の文は、表tを問い合せて、整形式のJSONデータであるcol1値を戻します。STRICTおよびLAXキーワードが指定されていないため、この例はデフォルトのLAX設定を使用します。このため、この問合せは、厳密なJSON構文または緩いJSON構文を使用する値を戻します。

SELECT col1
  FROM t
  WHERE col1 IS JSON;

COL1
--------------------------------------------------
[ "LIT192", "CS141", "HIS160" ]
{ "Name": "John" }
{ "Grade Values" : { A : 4.0, B : 3.0, C : 2.0 } }
{ "isEnrolled" : true }
{ "isMatriculated" : False }

次の文は、表tを問い合せて、整形式のJSONデータであるcol1値を戻します。この例は、STRICT設定を指定します。このため、この問合せは、厳密なJSON構文を使用する値のみ戻します。

SELECT col1
  FROM t
  WHERE col1 IS JSON STRICT;

COL1
--------------------------------------------------
[ "LIT192", "CS141", "HIS160" ]
{ "Name": "John" }
{ "isEnrolled" : true }

次の文は表tを問い合せて緩いJSON構文を使用するcol1値を戻しますが、厳密なJSON構文を使用するcol1値を省略します。このため、この問合せは、緩いJSON構文で使用できる例外を含む値のみ戻します。

SELECT col1
  FROM t
  WHERE col1 IS NOT JSON STRICT AND col1 IS JSON LAX;

COL1
--------------------------------------------------
{ "Grade Values" : { A : 4.0, B : 3.0, C : 2.0 } }
{ "isMatriculated" : False }

一意キーのテスト: 例

次の文は、col1列を使用した表tを作成します。

CREATE TABLE t (col1 VARCHAR2(100));

次の文は、値を表tの列col1に挿入します。

INSERT INTO t VALUES ('{a:100, b:200, c:300}');
INSERT INTO t VALUES ('{a:100, a:200, b:300}');
INSERT INTO t VALUES ('{a:100, b : {a:100, c:300}}');

次の文は、表tを問い合せて各オブジェクト内に一意のキー名を持つ整形式のJSONデータであるcol1値を戻します。

SELECT col1 FROM t
  WHERE col1 IS JSON WITH UNIQUE KEYS;

COL1
---------------------------
{a:100, b:200, c:300}
{a:100, b : {a:100, c:300}}

キー名aが2回表示され、2つの異なるオブジェクトにあるため、2番目の行が戻されます。

次の文は、表tを問い合せて、各オブジェクト内に一意のキー名があるかどうかに関係なく整形式のJSONデータであるcol1値を戻します。

SELECT col1 FROM t
  WHERE col1 IS JSON WITHOUT UNIQUE KEYS;

COL1
---------------------------
{a:100, b:200, c:300}
{a:100, a:200, b:300}
{a:100, b : {a:100, c:300}}

CHECK制約としてのIS JSONの使用方法: 例

次の文は、表j_purchaseorderを作成し、JSONデータを列po_documentに格納します。この文は、CHECK制約としてIS JSON条件を使用し、整形式のJSONのみ列po_documentに格納します。

CREATE TABLE j_purchaseorder
  (id RAW (16) NOT NULL,
   date_loaded TIMESTAMP(6) WITH TIME ZONE,
   po_document CLOB CONSTRAINT ensure_json CHECK (po_document IS JSON));

関連項目:

『JSON開発者ガイド』条件IS JSONおよびIS NOT JSON

JSON_EQUAL条件

目的

Oracle SQL条件JSON_EQUALは2つのJSON値を比較してtrueを戻します。2つの値が同じでない場合、falseを返します。入力値は有効なJSONデータである必要があります。

この比較では、意味のない空白と、意味のないオブジェクト・メンバーの順序は無視されます。たとえば、JSONオブジェクトに同じメンバーがある場合、その順序に関係なく、これらのオブジェクトは等しくなります。

比較された2つの入力のいずれかに1つ以上のフィールドの重複がある場合、JSON_EQUALによって戻される値は特定されません。

JSON_EQUALでは、ERROR ON ERRORFALSE ON ERRORおよびTRUE ON ERRORがサポートされています。デフォルトはFALSE ON ERRORです。エラーの典型的な例は、入力式が有効なJSONでない場合です。

次の文はTRUEを戻します。

JSON_EQUAL('{}', '{ }')
JSON_EQUAL('{a:1, b:2}', '{b:2 , a:1 }')

次の文はFALSEを返します。

JSON_EQUAL('{a:"1"}', '{a:1 }') -> FALSE

次の文は、ORA-40441 JSON構文エラーになります

JSON_EQUAL('[1]', '[}' ERROR ON ERROR)

関連項目:

JSON_EXISTS条件

SQL/JSON条件JSON_EXISTSを使用して、指定されたJSON値がJSONデータにあるかどうかをテストします。この条件は、JSON値が存在する場合にTRUEを戻し、JSON値が存在しない場合にFALSEを戻します。

JSON_exists_condition::=

JSON_passing_clause::=

JSON_exists_on_error_clause::=

JSON_exists_on_empty_clause::=

json_exists_on_empty_clause.epsの説明が続きます
図json_exists_on_empty_clause.epsの説明

expr

この句は、評価の対象となるJSONデータを指定するために使用します。exprでは、テキスト・リテラルを評価する式を指定します。exprが列である場合、列のデータ型はVARCHAR2CLOBまたはBLOBのいずれかである必要があります。exprがnullまたは長さゼロのテキスト・リテラルを評価する場合、この条件はUNKNOWNを戻します。

exprが厳密なまたは緩い構文を使用した整形式のJSONデータのテキスト・リテラルでない場合、この条件はデフォルトでFALSEを戻します。JSON_exists_on_error_clauseを使用して、このデフォルトの動作をオーバーライドできます。JSON_exists_on_error_clauseを参照してください。

FORMAT JSON

exprがデータ・タイプBLOBの列の場合、FORMAT JSONを指定する必要があります。

JSON_basic_path_expression

この句を使用して、SQL/JSONパス式を指定します。この条件はパス式を使用してexprを評価し、パス式と一致する(パス式を満たす)JSON値があるかどうかを判断します。パス式はテキスト・リテラルである必要がありますが、パス式には、JSON_passing_clauseによって値がパス式に渡される変数を含めることができます。JSON_basic_path_expressionのセマンティクスの詳細は、Oracle Database JSON開発者ガイドを参照してください。

JSON_passing_clause

この句を使用して、値をパス式に渡します。exprには、VARCHAR2NUMBERBINARY_DOUBLEDATETIMESTAMPまたはTIMESTAMP WITH TIME ZONEデータ型の値を指定します。exprの評価結果は、JSON_basic_path_expressionの対応する識別子にバインドされます。

JSON_exists_on_error_clause

この句を使用して、exprが整形式のJSONデータでない場合にこの条件で戻される値を指定します。

次の句を指定できます。

  • ERROR ON ERROR - exprが整形式のJSONデータでない場合、適切なOracleエラーを戻します。

  • TRUE ON ERROR - exprが整形式のJSONデータでない場合にTRUEを戻します。

  • FALSE ON ERROR - exprが整形式のJSONデータでない場合にFALSEを戻します。これはデフォルトです。

JSON_exists_on_empty_clause

この句を使用して、JSONデータがSQL/JSONパス式を使用して評価されるときに一致が見つからない場合にこのファンクションで戻される値を指定します。

次の句を指定できます。

  • ERROR ON EMPTY - exprが整形式のJSONデータでない場合、適切なOracleエラーを戻します。

  • TRUE ON EMPTY - exprが整形式のJSONデータでない場合にTRUEを戻します。

  • FALSE ON EMPTY - exprが整形式のJSONデータでない場合にFALSEを戻します。これはデフォルトです。

次の文は、name列を使用した表tを作成します。

CREATE TABLE t (name VARCHAR2(100));

次の文は、値を表tの列nameに挿入します。

INSERT INTO t VALUES ('[{first:"John"}, {middle:"Mark"}, {last:"Smith"}]');
INSERT INTO t VALUES ('[{first:"Mary"}, {last:"Jones"}]');
INSERT INTO t VALUES ('[{first:"Jeff"}, {last:"Williams"}]');
INSERT INTO t VALUES ('[{first:"Jean"}, {middle:"Anne"}, {last:"Brown"}]');
INSERT INTO t VALUES (NULL);
INSERT INTO t VALUES ('This is not well-formed JSON data');

次の文は表tの列nameを問い合せて、最初の要素がプロパティ名firstのオブジェクトである配列で構成されるJSONデータを戻します。ON ERROR句は指定されません。このため、JSON_EXISTS条件は、整形式のJSONデータでない値に対してFALSEを戻します。

SELECT name FROM t
  WHERE JSON_EXISTS(name, '$[0].first');

NAME
--------------------------------------------------
[{first:"John"}, {middle:"Mark"}, {last:"Smith"}]
[{first:"Mary"}, {last:"Jones"}]
[{first:"Jeff"}, {last:"Williams"}]
[{first:"Jean"}, {middle:"Anne"}, {last:"Brown"}]

次の文は表tの列nameを問い合せて、2番目の要素がプロパティ名middleのオブジェクトである配列で構成されるJSONデータを戻します。ON ERROR句は指定されません。このため、JSON_EXISTS条件は、整形式のJSONデータでない値に対してFALSEを戻します。

SELECT name FROM t
  WHERE JSON_EXISTS(name, '$[1].middle');

NAME
--------------------------------------------------------------------------------
[{first:"John"}, {middle:"Mark"}, {last:"Smith"}]
[{first:"Jean"}, {middle:"Anne"}, {last:"Brown"}]

次の文は前の文と似ていますが、TRUE ON ERROR句が指定されている点が異なります。このため、JSON_EXISTS条件は、整形式のJSONデータでない値に対してTRUEを戻します。

SELECT name FROM t
  WHERE JSON_EXISTS(name, '$[1].middle' TRUE ON ERROR);

NAME
--------------------------------------------------------------------------------
[{first:"John"}, {middle:"Mark"}, {last:"Smith"}]
[{first:"Jean"}, {middle:"Anne"}, {last:"Brown"}]
This is not well-formed JSON data

次の文は表tの列nameを問い合せて、プロパティ名lastのオブジェクトである要素を含む配列で構成されるJSONデータを戻します。ワイルドカード記号(*)が配列索引に指定されます。このため、配列の索引番号に関係なく、問合せは、そのようなオブジェクトを含む配列を戻します。

SELECT name FROM t
  WHERE JSON_EXISTS(name, '$[*].last');

NAME
--------------------------------------------------
[{first:"John"}, {middle:"Mark"}, {last:"Smith"}]
[{first:"Mary"}, {last:"Jones"}]
[{first:"Jeff"}, {last:"Williams"}]
[{first:"Jean"}, {middle:"Anne"}, {last:"Brown"}]

次の文は、passing句を使用してフィルタ式を実行します。比較述語(@.middle == $var1)のSQL/JSON変数$var1は、PASSING句のバインド変数var1からその値を取得します。

値の比較にバインド変数を使用すると、問合せの再コンパイルが回避されます。

SELECT name FROM t

  WHERE JSON_EXISTS(name, '$[1]?(@.middle == $var1)' PASSING 'Anne' as "var1");

NAME

--------------------------------------------------------------------------------

[{first:"Jean"}, {middle:"Anne"}, {last:"Brown"}]

関連項目:

条件JSON_Exists

JSON_TEXTCONTAINS条件

SQL/JSON条件JSON_TEXTCONTAINSを使用して、指定された文字列がJSONプロパティ値にあるかどうかをテストします。この条件を使用して、特定のワードまたは数値でJSONデータをフィルタ処理できます。

この条件では次の引数を使用します。

  • JSONデータを含む表またはビューの列。JSONデータでの使用に特化して設計されているOracle TextデータであるJSON検索索引を列に定義する必要があります。列のJSONデータの各行は、JSONドキュメントといいます。

  • SQL/JSONパス式。ドキュメント内の特定のJSONオブジェクトと一致するかどうかの試行で、パス式が各JSONドキュメントに適用されます。パス式にはJSONオブジェクト・ステップのみ含むことができ、JSON配列ステップを含むことはできません。

  • 文字列。この条件は、配列値を含む一致したJSONオブジェクトのすべての文字列および数値のプロパティ値内の文字列を検索します。文字列は、プロパティ値の個別のワードとして存在する必要があります。たとえば、'beth'を検索すると、文字列のプロパティ値"beth smith"と一致しますが、"elizabeth smith"とは一致しません。'10'を検索すると、数値のプロパティ値10または文字列のプロパティ値"10 main street"と一致しますが、数値のプロパティ値110または文字列のプロパティ値"102 main street"とは一致しません。

この条件は、一致する場合にTRUEを戻し、一致しない場合にFALSEを戻します。

JSON_textcontains_condition::=

column

テストするJSONデータを含む表またはビューの列の名前を指定します。列のデータ型はVARCHAR2CLOBまたはBLOBである必要があります。JSONデータでの使用に特化して設計されているOracle TextデータであるJSON検索索引を列に定義する必要があります。列の値がnullまたは長さゼロのテキスト・リテラルである場合、この条件はUNKNOWNを戻します。

列の値が厳密な構文または緩い構文を使用した整形式のJSONデータのテキスト・リテラルでない場合、この条件はFALSEを戻します。

JSON_basic_path_expression

この句を使用して、SQL/JSONパス式を指定します。この条件はパス式を使用してcolumnを評価し、パス式と一致する(パス式を満たす)JSON値があるかどうかを判断します。パス式はテキスト・リテラルである必要があります。JSON_basic_path_expressionのセマンティクスの詳細は、Oracle Database JSON開発者ガイドを参照してください。

string

この条件は、stringで指定された文字列を検索します。文字列は一重引用符で囲みます。

次の文は、family_doc列を使用した表familiesを作成します。

CREATE TABLE families (family_doc VARCHAR2(200));

次の文は、列family_docのJSON検索索引を作成します。

CREATE INDEX ix
  ON families(family_doc)
  INDEXTYPE IS CTXSYS.CONTEXT
  PARAMETERS ('SECTION GROUP CTXSYS.JSON_SECTION_GROUP SYNC (ON COMMIT)');

次の文は、ファミリを示すJSONドキュメントを列family_docに挿入します。

INSERT INTO families
VALUES ('{family : {id:10, ages:[40,38,12], address : {street : "10 Main Street"}}}');

INSERT INTO families
VALUES ('{family : {id:11, ages:[42,40,10,5], address : {street : "200 East Street", apt : 20}}}');

INSERT INTO families
VALUES ('{family : {id:12, ages:[25,23], address : {street : "300 Oak Street", apt : 10}}}');

次の文は、トランザクションをコミットします。

COMMIT;

次の問合せは、ドキュメントのプロパティ値に10を含むJSONドキュメントを戻します。

SELECT family_doc FROM families
  WHERE JSON_TEXTCONTAINS(family_doc, '$', '10');

FAMILY_DOC
--------------------------------------------------------------------------------
{family : {id:10, ages:[40,38,12], address : {street : "10 Main Street"}}}
{family : {id:11, ages:[42,40,10,5], address : {street : "200 East Street", apt : 20}}}
{family : {id:12, ages:[25,23], address : {street : "300 Oak Street", apt : 10}}}

次の問合せは、idのプロパティ値に10を含むJSONドキュメントを戻します。

SELECT family_doc FROM families
  where json_textcontains(family_doc, '$.family.id', '10');

FAMILY_DOC
--------------------------------------------------------------------------------
{family : {id:10, ages:[40,38,12], address : {street : "10 Main Street"}}}

次の問合せは、agesプロパティの値の配列に10を含むJSONドキュメントを戻します。

SELECT family_doc FROM families
  WHERE JSON_TEXTCONTAINS(family_doc, '$.family.ages', '10');

FAMILY_DOC
--------------------------------------------------------------------------------
{family : {id:11, ages:[42,40,10,5], address : {street : "200 East Street", apt : 20}}}

次の問合せは、addressプロパティ値に10を含むJSONドキュメントを戻します。

SELECT family_doc FROM families
  WHERE JSON_TEXTCONTAINS(family_doc, '$.family.address', '10');

FAMILY_DOC
--------------------------------------------------------------------------------
{family : {id:10, ages:[40,38,12], address : {street : "10 Main Street"}}}
{family : {id:12, ages:[25,23], address : {street : "300 Oak Street", apt : 10}}}

次の問合せは、aptプロパティ値に10を含むJSONドキュメントを戻します。

SELECT family_doc FROM families
  WHERE JSON_TEXTCONTAINS(family_doc, '$.family.address.apt', '10');

FAMILY_DOC
--------------------------------------------------------------------------------
{family : {id:12, ages:[25,23], address : {street : "300 Oak Street", apt : 10}}}