0

私は現在ngx_postgresの幸せなユーザーです。しかし、私は最近、非常に奇妙なことをする必要があることに気付きました。基本的に、次の json 出力を生成する必要があります。

{
     "PatientName": {
         "Tag": "00100010",
         "VR": "PN",
         "PersonName": [
           {
             "SingleByte": "Wang^XiaoDong",
             "Ideographic": "王^小東"
           }
         ]
     },
},
{
     "PatientName": {
         "Tag": "00100010",
         "VR": "PN",
         "PersonName": [
           {
             "SingleByte": "John^Doe",
           }
         ]
     },
}

DICOM 規格を少し読むだけで、キーワード、タグ、VR の対応表を簡単に作成 (簡略化) できます。

CREATE TABLE equiv (
    "Keyword" varchar(64) PRIMARY KEY,
    "Tag" char(8) NOT NULL,
    "VR" char(2) NOT NULL,
);

さて、トリッキーな部分は、私が理解していないPatientNameのこの間接化です。私は試しました:

CREATE TABLE patientname (
    "SingleByte" varchar(64) primary key,
    "Ideographic" varchar(64),
);
CREATE TABLE patientlevel_impl_detail (
    "PatientName" varchar(64) references patientname("SingleByte"),
    "PatientID" character varying(64) NOT NULL
);
CREATE view patientlist as select
patientname."SingleByte",
patientname."Ideographic",
patientname."Phonetic",
patientlevel_impl_detail."PatientID"
FROM patientlevel_impl_detail,patientname where patientlevel_impl_detail."PatientName" = patientname."SingleByte";

ただし、いずれにせよ、TABLE および/または VIEW は常に平坦化され、代わりに次のような結果が得られます。

$ curl http://localhost:8080/patients
[
     {
         "Tag": "00100010",
         "VR": "PN",
         "SingleByte": "John^Doe",
         "Ideographic": null,
     },
]

したがって、PersonName をネストされた文字列 (ネストされた json ツリー) の配列にする方法がわかりません。

注: 私は 9.3 を使用していません。今のところ 9.1 を使用する必要があります。

4

1 に答える 1

1

9.1 では、9.1 のjson 拡張機能を入手してください。多くの手間を省くことができます。

次に行う必要があるのは、json 構造に一致するビューとしてネストされたデータ構造を作成することです。これには array_agg() を使用します。

CREATE view patientlist as select
arrayagg(patientname) as "PatientName"
patientlevel_impl_detail."PatientID"
FROM patientlevel_impl_detail,patientname 
where patientlevel_impl_detail."PatientName" = patientname."SingleByte";

次に、次のことができるはずです。

SELECT row_to_json(patientlist) FROM patientlist;
于 2013-11-14T14:19:00.570 に答える