Skip to main content

This documentation is for an older version of this product. See the latest version of this content.Opens in a new tab

JSON_OBJECT (SQL)

JSON オブジェクトとしてデータを返す変換関数です。

Synopsis

JSON_OBJECT(key:value [,key:value][,...] [NULL ON NULL | ABSENT ON NULL])

引数

引数 説明
key:value key:value ペアまたはコンマで区切られた key:value ペアのリスト。key はユーザが指定するリテラル文字列で、一重引用符で区切られます。value は、列名、集約関数、算術式、数値リテラル、文字列リテラル、またはリテラル NULL になります。

ABSENT ON NULL

NULL ON NULL

オプション — 返された JSON オブジェクトでの NULL 値の表示方法を指定するキーワード句。NULL ON NULL (既定) は、NULL (存在しない) データを null という言葉 (引用符なし) で表します。ABSENT ON NULL は NULL データを JSON オブジェクトから省略します。値が NULL の場合は key:value のペアを削除して、プレースホルダのコンマを残しません。このキーワード句は、空の文字列値に影響を与えません。

説明

JSON_OBJECT はコンマ区切りの key:value ペアのリスト (例 : 'mykey':colname) を取得して、これらの値を含む JSON オブジェクトを返します。key 名には、任意の文字列を一重引用符で囲んで指定できます。JSON_OBJECT は key 名に名前付け規約や一意性チェックを適用しません。value には、列名またはその他の式を指定できます。

JSON_OBJECT は、SELECT 文で他のタイプの選択項目と組み合わせることができます。JSON_OBJECT は、WHERE 節など、SQL 関数を使用できる他の場所に指定できます。

返される JSON オブジェクトの形式は、以下のとおりです。

{ "key1" : "value1" , "key2" : "value2" , "key3" : "value3" }

JSON_OBJECT は、文字列 (二重引用符で囲まれます) または数字として、オブジェクト値を返します。数字はキャノニック形式で返されます。数値文字列は、リテラルとして、二重引用符で囲まれて返されます。その他のすべてのデータ型 (例えば、日付や $List) は、文字列として返され、現在の %SelectMode によって返される値の形式が決まります。DISPLAY または ODBC モードがクエリに選択されている場合、JSON_OBJECT は key と value の両方の値を DISPLAY または ODBC モードで返します。

JSON_OBJECT では、テーブル内のすべてのフィールドを指定するための方法としてアスタリスク (*) 構文を使用することはできません。

返される JSON オブジェクトの列には、Expression (既定) というラベルが付けられます。JSON_OBJECT には列のエイリアスを指定できます。

選択モードおよび照合

現在の %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 は、値の前にスペースを挿入するので、一般に、LCASEUCASE などのケース変換関数を指定することが推奨されます。

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_OBJECTWHERE 節で使用して、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"

関連項目

FeedbackOpens in a new tab