20.1 SQL/JSONファンクションJSON_VALUEとブール型のJSON値の使用

JSONには、ブール型の値trueおよびfalseがあります。SQL/JSONファンクションjson_valueによってパス式がJSONのtrueまたはfalseに評価されると、BOOLEAN値またはVARCHAR2値('true'または'false')か、NUMBER値(trueの場合は1falseの場合は0)を返すことができます。

デフォルトでは、json_valueは文字列VARCHAR2 (文字列)値を返します。ターゲット・データがJSONのブール値の場合、デフォルトでは文字列の値'true'または'false'が返されます。例20-1に、これを示します。この問合せは'true'を返します。

RETURNING句を使用すると、戻りデータ型を指定できます。例20-2に、SQLのBOOLEAN値(trueまたはfalse)を返すためのRETURNING BOOLEANの使用を示します。この問合せは、trueを返します。例20-3に、PL/SQLの場合の同じ内容を示すとともに、ERROR ON ERROR句の使用を示します。

デフォルトでは、ターゲット・データがJSONのブール値の場合、RETURNING NUMBERによってエラーが発生します。ただし、句ALLOW BOOLEAN TO NUMBER CONVERSIONを含めると、エラーは発生しません。その場合、trueのJSON値に対して1が返され、false値に対して0が返されます。例20-4に、これを示します。この問合せは1を返します。

SQL/JSONファンクションjson_tableは、json_valueなどの他のSQL/JSON問合せファンクションを一般化します。これを使用してJSONのブール値を投影する場合、json_valueが暗黙的に使用され、生成されるSQL値はデフォルトでVARCHAR2値として返されます。したがって、デフォルトでは投影列のデータ型はVARCHAR2です。

ただし、json_valueの場合と同様に、JSONのブール値はBOOLEAN値として投影できます。また、列にNUMBERデータ型を指定して、ALLOW BOOLEAN TO NUMBER CONVERSION句を含めることで、NUMBER値として投影できます。

例20-1 JSON_VALUE: VARCHAR2として返されるJSONのブール値

VARCHAR2を返すことは、json_valueファンクションのデフォルト動作です。

SELECT json_value(data, '$.AllowPartialShipment')
  FROM j_purchaseorder;

例20-2 JSON_VALUE: BOOLEANとしてSQLに返されるJSONのブール値

この例では、ブールJSONデータに応じたSQL BOOLEAN値を返します。(BOOLEANデータ型は、リリース23ai以降のOracle SQLで使用できます。)

SELECT json_value(data, '$.AllowPartialShipment'
                  RETURNING BOOLEAN)
  FROM j_purchaseorder;

例20-3 JSON_VALUE: BOOLEANとしてPL/SQLに返されるJSONのブール値

この例では、句ERROR ON ERRORを使用して、エラーがあった場合にエラーを発生します。(その後、ユーザーの例外処理コードがエラーを処理できます。)

DECLARE
  b     BOOLEAN;
  jdata CLOB;
BEGIN
  SELECT data INTO jdata FROM j_purchaseorder
    WHERE rownum = 1;
  b := json_value(jdata, '$.AllowPartialShipment'
                  RETURNING BOOLEAN
                  ERROR ON ERROR);
END;
/ 

例20-4 JSON_VALUE: NUMBERとしてSQLに返されるJSONのブール値

この例では、句ALLOW BOOLEAN TO NUMBER CONVERSIONを使用してSQLのNUMBER1 (true)を返します。この句を指定しないと、RETURNING NUMBERによってブール型のJSONデータのエラーが発生します。

SELECT json_value(data, '$.AllowPartialShipment'
                  RETURNING NUMBER
                  ALLOW BOOLEAN TO NUMBER CONVERSION)
  FROM j_purchaseorder;