ABSENT ON NULL
オプションの ABSENT ON NULL キーワード句を指定すると、NULL (または NULL リテラル) の列値は、JSON 配列に含まれなくなります。JSON 配列にプレースホルダは含まれません。この結果、JSON 配列に含まれる要素の数が違ってくる可能性があります。例えば、以下のプログラムが返す JSON 配列では、一部のレコードは 3 番目の配列要素は Age になり、他のレコードでは 3 番目の要素は FavoriteColors になります。
SELECT JSON_ARRAY(%ID,Name,FavoriteColors,Age ABSENT ON NULL) FROM Sample.Person
キーワード句を指定しない場合、既定は NULL ON NULL になり、NULL は null という単語で (引用符による区切りなしで)、コンマ区切りの配列要素として表示されます。したがって、JSON_ARRAY 関数から返される JSON 配列はすべて、同じ数の配列要素を持つことになります。
例
以下の例は、JSON_ARRAY を適用して、コンマ区切りのフィールド値リストを持つ JSON 配列をフォーマットします。
SELECT TOP 3 JSON_ARRAY(%ID,Name,Age,Home_State) FROM Sample.Person
以下の例は、JSON_ARRAY を適用して、Name フィールド値を含む単一の要素を持つ JSON 配列をフォーマットします。
SELECT TOP 3 JSON_ARRAY(Name) FROM Sample.Person
以下の例は、JSON_ARRAY を適用して、リテラルおよびフィールド値を含む JSON 配列をフォーマットします。
SELECT TOP 3 JSON_ARRAY('Employee from',%TABLENAME,Name,SSN) FROM Sample.Employee
以下の例は、JSON_ARRAY を適用して、NULL およびフィールド値を含む JSON 配列をフォーマットします。
SELECT JSON_ARRAY(Name,FavoriteColors) FROM Sample.Person
WHERE Name %STARTSWITH 'S'
以下の例は、JSON_ARRAY を適用して、結合されたテーブルのフィールド値を含む JSON 配列をフォーマットします。
SELECT TOP 3 JSON_ARRAY(E.%TABLENAME,E.Name,C.%TABLENAME,C.Name)
FROM Sample.Employee AS E,Sample.Company AS C
以下のダイナミック SQL の例では ODBC %SelectMode が設定されます。これは、JSON 配列の値を含むすべてのフィールドを表す方法を決定します。クエリは、%EXTERNAL フォーマット変換関数を適用することによって、特定の JSON 配列の要素に対応するこの選択モードをオーバーライドします。
SET myquery = 3
SET myquery(1) = "SELECT TOP 8 DOB,JSON_ARRAY(Name,DOB,FavoriteColors) AS ODBCMode, "
SET myquery(2) = "JSON_ARRAY(Name,DOB,%EXTERNAL(DOB),%EXTERNAL(FavoriteColors)) AS ExternalTrans "
SET myquery(3) = "FROM Sample.Person"
SET tStatement = ##class(%SQL.Statement).%New()
SET tStatement.%SelectMode=1
WRITE "SelectMode is ODBC",!
SET qStatus = tStatement.%Prepare(.myquery)
IF qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT}
SET rset = tStatement.%Execute()
IF rset.%SQLCODE=0 { WRITE !,"Executed query",! }
ELSE { SET badSQL=##class(%Exception.SQL).%New(,rset.%SQLCODE,,rset.%Message)}
DO rset.%Display()
WRITE !,"End of data"
以下の例は、JSON_ARRAY を WHERE 節で使用して、OR 構文を使用しないで複数の列で Contains テストを実行します。
SELECT Name,Home_City,Home_State FROM Sample.Person
WHERE JSON_ARRAY(Name,Home_City,Home_State) [ 'X'