問題:
データが次のような状況に遭遇しました。 1 対多の関係をより構造化された読みやすい方法で表現したいと考えています。具体的には、一意の ID とカンマ区切りの値のリストを含む列を含むテーブルを、個別の値がそれぞれ個別の列に表示されるテーブルに変換します。
Informix SQL ソリューション:
Informix SQL で推奨されるアプローチは、ユーザー定義の集計関数を利用することです。 Informix は group_concat() 関数をネイティブに提供していませんが、その機能を模倣するカスタム集計を作成できます。
ユーザー定義集計の作成:
次のコードは、その方法を示しています。必要なユーザー定義を作成するには集計:
CREATE FUNCTION gc_init(dummy VARCHAR(255)) RETURNING LVARCHAR; RETURN ''; END FUNCTION; CREATE FUNCTION gc_iter(result LVARCHAR, value VARCHAR(255)) RETURNING LVARCHAR; IF result = '' THEN RETURN TRIM(value); ELSE RETURN result || ',' || TRIM(value); END IF; END FUNCTION; CREATE FUNCTION gc_comb(partial1 LVARCHAR, partial2 LVARCHAR) RETURNING LVARCHAR; IF partial1 IS NULL OR partial1 = '' THEN RETURN partial2; ELIF partial2 IS NULL OR partial2 = '' THEN RETURN partial1; ELSE RETURN partial1 || ',' || partial2; END IF; END FUNCTION; CREATE FUNCTION gc_fini(final LVARCHAR) RETURNING LVARCHAR; RETURN final; END FUNCTION; CREATE AGGREGATE group_concat WITH (INIT = gc_init, ITER = gc_iter, COMBINE = gc_comb, FINAL = gc_fini);
使用法:
集計を作成したら、それをクエリで利用して目的の変換を実現できます:
SELECT id, group_concat(codes) FROM anonymous_table GROUP BY id;
例:
という名前のテーブルの例を考えてみましょう。 anonymous_table:
CREATE TEMP TABLE anonymous_table ( id INTEGER NOT NULL, codes CHAR(4) NOT NULL, PRIMARY KEY (id, codes) ); INSERT INTO anonymous_table VALUES(63592, 'PELL'); INSERT INTO anonymous_table VALUES(58640, 'SUBL'); INSERT INTO anonymous_table VALUES(58640, 'USBL'); INSERT INTO anonymous_table VALUES(73571, 'PELL'); INSERT INTO anonymous_table VALUES(73571, 'USBL'); INSERT INTO anonymous_table VALUES(73571, 'SUBL');
前述のクエリをこのテーブルに適用すると、次の出力が得られます:
58640 SUBL,USBL 63592 PELL 73571 PELL,SUBL,USBL
これは、集約関数が各一意の ID に関連付けられたコードをどのように効果的にグループ化し、連結するかを示しています。 、より整理された方法でデータを表示します。
以上がInformix SQL で 1 対多の関係を個別の列に変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。