これは InterSystems FAQ サイトの記事です。
JSON利用の普及に伴いインターシステムズは、JSONに関連する様々な機能強化をIRISに対して行なっています。
その一環として、SQLのJSON_OBJECTのサポートがあります。
この機能に関して現時点より(2025年6月)古いバージョンでは残念ながら制限や不具合が存在しています。
今後も機能強化やバグフィックスを継続していく予定となっているため、この機能の利用を検討および既に利用している方は最新バージョンでのご利用をお勧めします。
ここでは、現時点でわかっている制限事項/不具合についてお知らせします。
- VIEW経由でJSON_OBJECTを利用した場合にエラーとなる場合がある 以下のようなクラスとVIEWを定義します。
Class User.test Extends %Persistent
{
Property p1 As %String
Property p2 As %String
}
Class User.myview [ ClassType = view, ViewQuery = { select p1 as v10, p1 as v11, p2 as v12 from test } ] { }
この定義に対してデータを登録後、以下のようなSQL文を発行すると、<UNDEFINED>エラーが発生します。
select JSON_OBJECT('x':v10, 'y':v11) from myview
以下のようなエラーメッセージが表示されます。
<UNDEFINED>%0AmBk1+4^%sqlcq.USER.cls47.1
ただしデータが0件の場合はエラーは発生しません。
この問題は、2025.2でも解決していません。
修正時期は未定です。
- JSON _OBJECT内にJSON_ARAYAGGを含める場合の問題
サンプルとして提供しているSample.Personの定義をロードします。
サンプルデータの取得方法は以下をご参照ください。
サンプルデータの取得
データを生成(Populate)した後、以下のようなクエリーを発行します。
SELECT JSON_OBJECT('states': JSON_ARRAYAGG(Home_State) )
FROM Sample.Person WHERE Home_State %STARTSWITH 'D'
以下のような結果が返ってくる場合、それは正しい結果ではありません。
{"states":"[\"DE\",\"DE\",\"DE\",\"DE\",\"DE\"]"}
以下のような結果が正しいものになります。
{"states":["DE","DE","DE","DE","DE"]}
この問題は、2025.1以降のバージョンで修正されています。
- SQLの中でCASE文を指定した場合に出力結果が正しくない場合がある。
以下のようなクラス定義とVIEW定義を作成します。
Class JSON.Person Extends %Persistent [ DdlAllowed, ProcedureBlock, SqlRowIdPrivate, SqlTableName = J_PERSON ]
{
Property USERID As %String [ SqlColumnNumber = 2, SqlFieldName = USER_ID ]
Property NAME As %String [ SqlColumnNumber = 3, SqlFieldName = NAME ]
Property SEX As %String [ SqlColumnNumber = 4, SqlFieldName = SEX ]
Index IdxPerson On USERID [ Type = index, Unique ]
}
Class JSON.PersonView [ ClassType = view, CompileAfter = JSON.Person, DdlAllowed, Not ProcedureBlock, SqlTableName = J_PERSON_VIEW, ViewQuery = { SELECT A.USER_ID As USERID, A.NAME As NAME, CASE A.SEX WHEN 'M' THEN '1' ELSE '0' END AS ISMALE FROM J_PERSON A } ] { データを登録します。
データを登録します。
insert into JSON.J_PERSON values ('1','TARO','M');
insert into JSON.J_PERSON values ('2', 'HANA', 'F')
以下のようなクエリーを発行します。
SELECT USERID ,NAME ,ISMALE FROM JSON.J_PERSON_VIEW
以下のようにISMALEの値が文字列型として出力されます。
"1", "TARO", "1"
"2", "HANA", "0"
次に以下のようなクエリーを発行します。
SELECT JSON_OBJECT( 'userid':USERID ,'name':NAME ,'ismale':ISMALE ) FROM JSON.J_PERSON_VIEW;
以下のようなJSONデータが返ってきます。
{"userid":"1", "name":"TARO", "ismale":1}
{"userid":"2", "name":"HANA", "ismale":0}
この結果は誤りです。
ismaleに関しては、数字ではなくリテラル(文字)として返すのが正しい動作です。
この問題は2025.1以降のバージョンで修正されています。