[pgsql-jp: 30919] Re: レコード内容から列名を取得・生成?するSQL

Takao Kato sirius @ jp.fujitsu.com
2003年 9月 2日 (火) 18:00:34 JST


加藤@川崎です。

せっかく綺麗に話が終わったのに蒸しかえす奴。 ^^;


こういう形式は駄目ですか?

name |  yuubin                             | text
-----------------------------------------------------------------------------------
A    |  {'111-1111','222-2222','333-3333'} | {'tanaka1','tanaka2','tanaka3'}
B    |  {'444-4444','555-5555','666-6666'} | {'yama1','yama2','yama3'}
C    |  {'777-7777','888-8888','999-9999'} | {'ito1','ito2','ito3'}

これで良ければ、以前便乗質問して [pgsql-jp: 30563] にて和田さんが答え
てくださったPL/PGSQLの関数をTEXT用に書き換えた関数を利用すれば可能です。
# あの関数、結構便利です。ありがとう > 和田さん

例えばその関数を text_list とした場合、

SELECT name,text_list(yuubin) as yuubin,text_list(text) as text FROM
 (SELECT m.name,  f.number, l.yuubin, f.text FROM master m, fk_table f, location l
   WHERE m.id = f.fk_master AND  l.id = f.fk_location
   ORDER BY m.name, f.text, f.number) t GROUP BY t.name;

でいけますね。

また、元々要望されていた形式にするのであれば、

SELECT name,yuubin[1] as youbin1,text[1] as text1 ..... FROM (
 SELECT name,text_list(yuubin) as yuubin,text_list(text) as text FROM
  (SELECT m.name,  f.number, l.yuubin, f.text FROM master m, fk_table f, location l
    WHERE m.id = f.fk_master AND  l.id = f.fk_location
    ORDER BY m.name, f.text, f.number) t GROUP BY t.name
 ) tt;

としても良いですかね。ただし、後者は他の方々が書かれているように集約数
がわかっている(今回なら3つ)ときに限ります。

あと、斎見さんの指摘されているように、空(NULL)に対する対策を取ってやら
ないと痛い結果になりますね。
# NULLの時の集約ってどうなるんだったかなぁ....

では
-------------------------------------------------------------
加藤@川崎



pgsql-jp メーリングリストの案内