5 SQL/JSON条件IS JSONおよびIS NOT JSON

SQL/JSON条件is jsonおよびis not jsonは補足的な条件です。これらは、引数が構文的に正しい(つまり、整形式の)JSONデータかどうかをテストします。これらは、SELECT文のCASE式またはWHERE句で使用できます。is jsonはチェック制約で使用できます。

引数が構文的に正しい場合、is jsonはtrueを戻し、is not jsonはfalseを戻します。

解析中にエラーが発生した場合、エラーは発生せず、データは整形式ではないとみなされます。is jsonはfalseを返し、is not jsonはtrueを返します。解析中以外にエラーが発生した場合は、そのエラーが発生します。

整形式のデータとは、構文的に正しいデータであることを意味します。テキストとして格納されているJSONデータは、厳密な構文と緩慢な構文と呼ばれる2つの意味での整形式にすることができます。また、テキストのJSONデータの場合は、JSONオブジェクトに重複したフィールド(キー)を含めることができるかどうかを指定できます。

テキストのJSONデータがデータベース内で生成される場合は、キーワードSTRICTを指定した条件is jsonを満たします。これには次の方法による生成が含まれます。

  • SQL/JSON生成関数を使用(FORMAT JSONまたはTREAT AS JSONにキーワードSTRICTを指定しない場合。このキーワードには、データがJSONデータであることを宣言する意味があり(ユーザーがそれを保証します)、整形式であるかどうかはチェックされません)

  • SQLファンクションjson_serializeの使用

  • PL/SQL DOMでのSQLファンクションto_clobto_blobまたはto_varchar2の使用

  • SQL/JSONファンクションjson_queryの使用

  • FORMAT JSONを指定したSQL/JSONファンクションjson_tableの使用

関連項目:

is jsonおよびis not jsonの詳細は、Oracle Database SQL言語リファレンスを参照してください。

5.1 JSONオブジェクトの一意フィールドと重複フィールド

デフォルトでは、フィールド名は、特定のJSONオブジェクトに対して一意である必要はありません。しかし、特定のJSONデータに重複するフィールド名を持つオブジェクトがない場合のみ、このJSONデータが整形式であるとみなすように指定することもできます。

JSON標準では、特定のJSONオブジェクトに対してフィールド名が一意である必要があるかどうかは指定されません。つまり、このことは先験的に、整形式のJSONオブジェクトには同じフィールド名を持つ複数のメンバーを設定できることを意味します。重複する名前のチェックには追加の時間が必要になるため、これがOracle DatabaseでJSONデータを扱う際のデフォルトの動作になっています。

特定のJSONデータに含まれるすべてのオブジェクトが一意のフィールド名を持つ(つまり、重複するフィールド名を持つオブジェクトがない)場合のみ、このJSONデータが整形式であるとみなすように指定できます。これは、SQL/JSON条件is jsonでキーワードWITH UNIQUE KEYSを使用することで行います。Foot 1

UNIQUE KEYSを指定しないか、キーワードWITHOUT UNIQUE KEYSを使用する場合、オブジェクトが重複フィールド名を持ったままでも整形式であるとみなすことができます。

Oracle Databaseで採用されている評価では常に、特定のフィールド名を持つオブジェクト・メンバーの1つのみが使用されます。同じフィールド名を持つ他のメンバーは無視されます。このような複数のメンバーのうちどれが使用されるかは指定されていません。

整形式のJSONデータで重複フィールド名が許可されるかどうかは、整形式かどうかの確認に、厳密な構文と緩慢な構文のどちらが使用されるかとかかわっています。

5.2 厳密なJSON構文と緩慢なJSON構文について

JSON向けのOracleのデフォルト構文は緩慢です。特に、この構文は、オブジェクト・フィールドに対してJavaScript構文を反映し、ブール型の値およびnull値では大/小文字が区別されず、数字、ホワイトスペースおよびUnicode文字のエスケープについてはより寛容です。

標準ECMA-404のJSONデータ交換フォーマット、およびECMA-262のECMAScript言語指定により、JSON構文が定義されます。

これらの指定に応じて、各JSONのフィールドおよび各文字列値は、二重引用符(")で囲む必要があります。Oracleではこの厳密なJSON構文をサポートしていますが、これはデフォルトの構文ではありません

JavaScript表記法では、オブジェクト・リテラルで使用されるフィールドは、二重引用符で囲むことができますが、必須ではありません。これはまた、一重引用符(')で囲むこともできます。Oracleではこの緩慢なJSON構文もサポートしており、これがデフォルトの構文です。

また、実際に、一部のJavaScript実装(ただし、JavaScript標準ではありません)では次の1つ以上が許可されています。

  • キーワードtruefalseおよびnullの大/小文字の相違(TRUETrueTrUefALSeNulLなど)。

  • 配列の最後の要素またはオブジェクトの最後のメンバーの後ろに追加されるカンマ(,) ([a, b, c,]{a:b, c:d,}など)。

  • 先頭に1つ以上の0がある数字(0042.3など)。

  • 小数点の前に0がない小数(0.14ではなく.14など)。

  • 小数点の後に小数部分がない数字(342.1.e27など)。

  • 数値がマイナスではないことを意味する、数字の前のプラス記号(+) (+1.3など)。

この構文も、Oracleのデフォルトの(緩慢な) JSON構文の一部として許可されます。(厳密な数字構文は、JSON標準を参照してください。)

ASCIIのスペース文字(U+0020)以外にも、JSON標準では、引用符で囲まれたフィールドまたは文字列値の外側で使用される場合、次の文字は重要でない(無視される)ホワイトスペースとして定義されています。

  • タブ、水平タブ(HT ^I、10進数の9、U+0009、\t)

  • 行送り、改行(LF ^J、10進数の10、U+000A、\n)

  • キャリッジ・リターン(CR ^M、10進数の13、U+000D、\r)

ただし、JSONの緩慢な構文では、ASCII制御文字(0-31)のすべて、およびASCIIスペース文字(10進数の32、U+0020)は(重要でない)ホワイトスペース文字として処理されます。制御文字には次のようなものがあります。

  • Null (NUL ^@、10進数の0、U+0000、\0)

  • ベル(NEL ^G、10進数の7、U+0007、 \a)

  • 垂直タブ(VT ^K、10進数の11、U+000B)

  • エスケープ(ESC ^[、10進数の27、U+001B、\e)

  • 削除(DEL ^?、10進数の127、U+007F)

ASCIIのスペース文字(U+0020)は、引用符で囲まれたフィールドまたは文字列値内で許可されてエスケープされていない唯一のホワイトスペース文字です。これは、厳密なJSON構文と緩慢なJSON構文の両方に対して当てはまります。

厳密なJSON構文と緩慢なJSON構文の両方において、引用符で囲まれたオブジェクト・フィールドおよび文字列値に含めることができるのはUnicode文字のみですが、これらの一部は次のようにエスケープする必要があります。

  • ASCII制御文字は許可されていませんが、\b (バックスペース)、\f (フォーム・フィード)、\n (改行、行送り)、\r (キャリッジ・リターン)および\t (タブ、水平タブ)の各エスケープ・シーケンスによって表される文字は除きます。

  • 二重引用符(")、スラッシュ(/)およびバックスラッシュ(\)文字もエスケープする(バックスラッシュを前に置く)必要があります(それぞれ\"\/および\\)。

緩慢なJSON構文では、引用符で囲まれていないオブジェクト・フィールドに、ホワイトスペースとJSON構造文字(左右の大カッコ([])と中カッコ({})、コロン(:)およびカンマ(,))を除く任意のUnicode文字を含めることができますが、エスケープ・シーケンスは許可されません。

名前または文字列にも任意のUnicode文字を含めることができますが、この場合、Unicodeコード・ポイントを表す4つのASCIIの16進数字を後ろに付けたASCIIのエスケープ構文\uを使用します。

厳密なJSON構文と緩慢なJSON構文のいずれにおいても、出力可能でないかホワイトスペースとして表示される可能性がある他のUnicode文字(ノーブレークスペース文字(U+00A0)など)はホワイトスペースとみなされません

表5-1は、JSON構文のいくつかの例を示しています。

表5-1 JSONオブジェクト・フィールドの構文例

整形式かどうか

"part number": 1234

緩慢および厳密: はい。スペース文字は許可されます。

part number: 1234

緩慢(および厳密): いいえ。引用符で囲まれていない名前では、スペース文字を含むホワイトスペース文字は許可されません。

"part\tnumber": 1234

緩慢および厳密: はい。タブ文字のエスケープ・シーケンスは許可されます。

"part    number": 1234

緩慢および厳密: いいえ。エスケープされていないタブ文字は許可されません。エスケープされていないホワイトスペース文字で許可されるのはスペースのみです。

"\"part\"number": 1234

緩慢および厳密: はい。名前が引用符で囲まれている場合、エスケープされている二重引用符は許可されます。

\"part\"number: 1234

緩慢および厳密: いいえ。名前は引用符で囲む必要があります。

'\"part\"number': 1234

緩慢: はい、厳密: いいえ。一重引用符で囲まれた名前(オブジェクト・フィールドと文字列)は、緩慢な構文でのみ許可されます。引用符で囲まれた名前では、エスケープされている二重引用符が許可されます。

"pärt : number":1234

緩慢および厳密: はい。引用符で囲まれた名前では、任意のUnicode文字が許可されます。これには、ホワイトスペース文字と、コロン(:)などの、JSONの構造的な文字が含まれます。

part:number:1234

緩慢(および厳密): いいえ。引用符で囲まれている名前では、構造文字は許可されません。

関連項目:

5.3 厳密なJSON構文と緩慢なJSON構文の指定

Oracle Database向けのデフォルトのJSON構文は緩慢です。構文が厳密か緩慢かが問題になるのは、SQL/JSON条件is jsonおよびis not jsonの場合のみです。他のすべてのSQL/JSONファンクションおよび条件では、入力を解析するために緩慢な構文が使用され、出力を戻すために厳密な構文が使用されます。

特定のJSON入力データに厳密に正しい構文が使用されていることを確認する必要がある場合は、最初にis jsonまたはis not jsonを使用してチェックしてください。

JSON標準に応じてデータを厳密な整形式としてチェックするよう指定するには、(STRICT) (カッコを含む)をis jsonまたはis not json式に追加します。

例5-1に、これを示します。これは例4-1と同じですが、列に挿入されたすべてのデータがJSON標準に応じた整形式であることを確認するために(STRICT)が使用されています。

関連項目:

CREATE TABLEの詳細は、Oracle Database SQL言語リファレンスを参照してください。

例5-1 JSONデータが厳密な整形式(標準)であることを確認するためのチェック制約でのIS JSONの使用

CREATE TABLE j_purchaseorder
  (id          VARCHAR2 (32) NOT NULL PRIMARY KEY,
   date_loaded TIMESTAMP (6) WITH TIME ZONE,
   po_document VARCHAR2 (32767)
   CONSTRAINT ensure_json CHECK (po_document IS JSON (STRICT)));


脚注の凡例

脚注1: オブジェクト・フィールドは、オブジェクトの「キー」と呼ばれることもあります。