選択モードおよび照合
現在の %SelectMode プロパティによって、返される JSON オブジェクト値のフォーマットが決まります。選択モードを変更することによって、すべての日付値および %List 値が、その選択モードのフォーマットの文字列として JSON オブジェクトに組み込まれます。フォーマット変換関数 (%EXTERNAL、%INTERNAL、%ODBCIN、%ODBCOUT) を JSON_OBJECT 内の個別のフィールド名に適用することによって、現在の選択モードをオーバーライドできます。フォーマット変換関数を JSON_OBJECT に適用しても、JSON オブジェクトの key:value ペアは文字列であるため、影響はありません。
既定の照合によって、返される JSON オブジェクト値の照合が決まります。照合関数を JSON_OBJECT に適用し、キーと値の両方を変換できます。通常、キーは大文字と小文字を区別するため、照合関数を JSON_OBJECT に割り当てないでください。InterSystems IRIS は JSON オブジェクトへのフォーマットの後で照合を適用します。したがって、%SQLUPPER(JSON_OBJECT('k1':f1,'k2':f2)) では、JSON オブジェクトの key および value 文字列がすべて大文字に変換されます。%SQLUPPER は、オブジェクト内の値の前ではなく、JSON オブジェクトの前にスペースを挿入します。
JSON_OBJECT 内では、照合関数を key:value ペアの値部分に適用できます。%SQLUPPER は、値の前にスペースを挿入するので、一般に、LCASE や UCASE などのケース変換関数を指定することが推奨されます。
ABSENT ON NULL
オプションの ABSENT ON NULL キーワード句を指定すると、NULL (または NULL リテラル) の列値は、JSON オブジェクトに含まれなくなります。JSON オブジェクトにプレースホルダは含まれません。この結果、JSON オブジェクトに含まれる key:value ペアの数が違ってくる可能性があります。例えば、以下のプログラムが返す JSON オブジェクトでは、一部のレコードは 3 番目の key:value ペアは Age になり、他のレコードでは 3 番目の key:value ペアは FavoriteColors になります。
SELECT JSON_OBJECT('id':%ID,'name':Name,'colors':FavoriteColors,'years':Age ABSENT ON NULL) FROM Sample.Person
キーワード句を指定しない場合、既定は NULL ON NULL になり、NULL は null という単語で (引用符による区切りなしで)、key:value ペアの値として表示されます。したがって、JSON_OBJECT 関数から返される JSON オブジェクトはすべて、同じ数の key:value ペアを持つことになります。
例
以下の例は、JSON_OBJECT を適用して、フィールド値を含む JSON オブジェクトをフォーマットします。
SELECT TOP 3 JSON_OBJECT('id':%ID,'name':Name,'birth':DOB) FROM Sample.Person
以下の例は、JSON_OBJECT を適用して、リテラルおよびフィールド値を含む JSON オブジェクトをフォーマットします。
SELECT TOP 3 JSON_OBJECT('lit':'Employee from','t':%TABLENAME,
'name':Name,'num':SSN) FROM Sample.Employee
以下の例は、JSON_OBJECT を適用して、NULL およびフィールド値を含む JSON オブジェクトをフォーマットします。
SELECT JSON_OBJECT('name':Name,'colors':FavoriteColors) FROM Sample.Person
WHERE Name %STARTSWITH 'S'
以下の例は、JSON_OBJECT を適用して、結合テーブルのフィールド値を含む JSON オブジェクトをフォーマットします。
SELECT TOP 3 JSON_OBJECT('e.t':E.%TABLENAME,'e.name':E.Name,'c.t':C.%TABLENAME,
'c.name':C.Name) FROM Sample.Employee AS E,Sample.Company AS C
以下の例は、JSON_OBJECT を WHERE 節で使用して、OR 構文を使用しないで複数の列で Contains テストを実行します。
SELECT Name,Home_City,Home_State FROM Sample.Person
WHERE JSON_OBJECT('name':Name,'city':Home_City,'state':Home_State) [ 'X'
以下のダイナミック SQL の例では ODBC %SelectMode が設定されます。これは、JSON オブジェクト値を含むすべてのフィールドを表す方法を決定します。このクエリは、%EXTERNAL フォーマット変換関数を適用することによって、特定の JSON_OBJECT 値に対応するこの選択モードをオーバーライドします。
SET myquery = 3
SET myquery(1) = "SELECT TOP 8 JSON_OBJECT('ODBCBday':DOB,'DispBday':%EXTERNAL(DOB)),"
SET myquery(2) = "JSON_OBJECT('ODBCcolors':FavoriteColors,'DispColors':%EXTERNAL(FavoriteColors)) "
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"