20.1 SQL/JSONファンクションJSON_VALUEとブール型のJSON値の使用
JSONには、ブール型の値true
およびfalse
があります。SQL/JSONファンクションjson_value
によってパス式がJSONのtrue
またはfalse
に評価されると、BOOLEAN
値またはVARCHAR2
値('true'
または'false'
)か、NUMBER
値(true
の場合は1
、false
の場合は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のNUMBER
値1
(true)を返します。この句を指定しないと、RETURNING NUMBER
によってブール型のJSONデータのエラーが発生します。
SELECT json_value(data, '$.AllowPartialShipment'
RETURNING NUMBER
ALLOW BOOLEAN TO NUMBER CONVERSION)
FROM j_purchaseorder;