JSON_OBJECT

json_object_content::=

JSON_on_null_clause::=

JSON_returning_clause::=

目的

SQL/JSONファンクションJSON_OBJECTは、キー/値ベアのシーケンスか、オブジェクト・タイプ・インスタンスのどちらかを入力に取ります。コレクション・タイプをJSON_OBJECTに渡すことはできません。

これは、それらのキーと値のペアごとのオブジェクト・メンバーを含むJSONオブジェクトを戻します。

エントリ

regular_entry: プロパティ・キー/ペアを指定するには、この句を使用します。

regular_entry

  • KEYはオプションで、セマンティクスを明確にするために使用されます。

  • オプションのexprを使用して、大/小文字を区別するテキスト・リテラルとしてプロパティ・キー名を指定します。

  • exprを使用して、プロパティ値を指定します。exprには、SQL数値リテラル、テキスト・リテラル、日付、タイムスタンプのいずれかに評価される任意の式を指定できます。日付およびタイムスタンプのデータ型は、生成されるJSONオブジェクトまたは配列に、ISO日付書式に従ったJSON文字列として出力されます。exprが数値リテラルと評価される場合は結果のプロパティ値がJSON数値になり、そうでない場合は結果のプロパティ値が二重引用符で囲まれた大/小文字を区別するJSON文字列値になります。

    複数JSON_OBJECTエントリの区切りには、コロンを使用できます。

    SELECT JSON_OBJECT(
    'name' : first_name || ' ' || last_name,
    'email' : email,
    'phone' : phone_number,
    'hire_date' : hire_date
    )
    FROM employees
    WHERE employee_id = 140;

format_clause

入力式の後にFORMAT JSONを指定すると、結果の値がJSONデータを表し、出力で引用符で囲まれないことを宣言できます。

ワイルドカード

ワイルドカード・エントリは複数の列を選択し、*、table.*、view.*、t_alias.*などの形を指定できます。問合せの列をすべて明示的に指定せず、表、副問合せ、ビューのすべての列をJSONオブジェクトにマップするには、ワイルドカード・エントリを使用します。ここでは、select_listで直接使用するときと同じようにワイルドカード・エントリを使用しています。

例1

得られるJSONオブジェクトでは、キー名が対応する列の名前に当たります。

SELECT JSON_OBJECT(*)
FROM employees
WHERE employee_id = 140;

出力 1

{"EMPLOYEE_ID":140,"FIRST_NAME":"Joshua","LAST_NAME":"Patel","EMAIL":"JPAT
EL","PHONE_NUMBER":"650.121.1834","HIRE_DATE":"2006-04-
06T00:00:00","JOB_ID":"ST_CLERK","SALARY":2500,"COMMISSION_PCT":null,"MAN
AGER_ID":123,"DEPARTMENT_ID":50}

例2

この問合せは、結合問合せの特定の表から列を選択します。

SELECT JSON_OBJECT('NAME' VALUE first_name, d.*)
FROM employees e, departments d
WHERE e.department_id = d.department_id
AND e.employee_id =140

例3

この問合せは、部門名を1つのJSON配列値に変換します。

SELECT JSON_ARRAYAGG(JSON_OBJECT(*))
FROM departments

JSON_on_null_clause

この句を使用して、exprがNULLと評価される場合のこのファンクションの動作を指定します。

  • NULL ON NULL - NULL ON NULLが指定されている場合は、JSON NULL値は、指定したキーの値として使用されます。
    SELECT JSON_OBJECT('key1' VALUE NULL)  evaluates to  {"key1" :  null}
  • ABSENT ON NULL - この句を指定した場合は、JSONオブジェクトからプロパティのキーと値のペアが省略されます。

JSON_returning_clause

この句を使用して、戻り値のタイプを指定します。次のいずれかです。

  • バイト数または文字数としてサイズを指定するVARCHAR2。デフォルトは、バイトです。この句を省略するか、size値を指定せずにこの句を指定した場合、JSON_ARRAYVARCHAR2(4000)型の文字列を戻します。詳細は、「VARCHAR2データ型」を参照してください。SQLでVARCHAR2データ型を指定する場合、サイズを指定する必要があります。ただし、JSON_returning_clauseではサイズを省略できます。

  • シングルバイト文字またはマルチバイト文字を含むキャラクタ・ラージ・オブジェクトを戻すCLOB

  • AL32UTF8文字セットのバイナリ・ラージ・オブジェクトを戻すBLOB

  • WITH TYPENAME

STRICT

STRICT句を指定して、JSON生成ファンクションの出力が正しいJSONであることを確認します。チェックに失敗すると、構文エラーが発生します。

例1: FORMAT JSONが使用されていないため、出力文字列は引用符内に表示されます

SELECT JSON_OBJECT ('name' value 'Foo') FROM DUAL
Output:
JSON_OBJECT('NAME'VALUE'FOO'FORMATJSON)
-------------------------------------------------
{"name":"Foo"}

例2: FORMAT JSONが使用されている場合、出力文字列は引用符で囲まれません。

SELECT JSON_OBJECT ('name' value 'Foo' FORMAT JSON ) FROM DUAL
Output:
JSON_OBJECT('NAME'VALUE'FOO'FORMATJSON)
-------------------------------------------------
{"name":Foo}

例3: FORMAT JSON STRICTが使用されている場合、JSON構文エラーになります。

SELECT JSON_OBJECT ('name' value 'Foo' FORMAT JSON STRICT ) FROM DUAL
Output:
ORA-40441: JSON syntax error

WITH UNIQUE KEYS

WITH UNIQUE KEYSを指定すると、生成されたJSONオブジェクトが一意キーを持つことが保証されます。

次の例では、それぞれが2つのキーと値のペアを含むJSONオブジェクトを戻します。

SELECT JSON_OBJECT (
    KEY 'deptno' VALUE d.department_id,
    KEY 'deptname' VALUE d.department_name 
    ) "Department Objects"
  FROM departments d
  ORDER BY d.department_id;

Department Objects
----------------------------------------
{"deptno":10,"deptname":"Administration"}
{"deptno":20,"deptname":"Marketing"}
{"deptno":30,"deptname":"Purchasing"}
{"deptno":40,"deptname":"Human Resources"}
{"deptno":50,"deptname":"Shipping"}
. . .

JSON_OBJECT列エントリ

場合によっては、キー値の式で列名を繰り返さないように、JSONオブジェクトのキー名を表の列と照合したいことがあります。たとえば:

SELECT JSON_OBJECT(
'first_name' VALUE first_name,
'last_name' VALUE last_name,
'email' VALUE email,
'hire_date' VALUE hire_date
)
FROM employees
WHERE employee_id = 140;

{"first_name":"Joshua","last_name":"Patel","email":"JPATEL","hire_date":"2006-04-
06T00:00:00"}

そうした場合に簡単な方法があり、1つの列値を入力として指定すると、対応するオブジェクトのエントリ・キーが、列の名前から推論されます。たとえば:

SELECT JSON_OBJECT(first_name, last_name, email, hire_date)
FROM employees
WHERE employee_id = 140; 

{"first_name":"Joshua","last_name":"Patel","email":"JPATEL","hire_date":"2006-04-
06T00:00:00"}

列名には、引用符付き、または引用符なしの識別子を使用できます。引用符なしの識別子を使用する場合、問合せのように識別子の大文字小文字が区別され、対応するオブジェクト・キー値の生成に使用されます。ただし、列値を参照する目的上、識別子は大文字小文字が区別されます。たとえば:

SELECT JSON_OBJECT(eMail)
FROM employees
WHERE employee_id = 140

{"eMail":"JPATEL"}

列名で入力したままなので、「M」が大文字です。