MySQL の GROUP_CONCAT あるいは、PostgreSQL の STRING_AGG から、CSV1行を作る。
作ってSELECTした文字列は、先日書いた原始的なメソッド
CSV形式の1行分の文字列からList<String>への変換 - Oboe吹きプログラマの黙示録
を使って、List<String> を取得する。
任意の列で、GROUP BY して、GROUP_CONCAT / STRING_AGG で join する時に
RFC4180 準拠、カンマ区切り、ダブルクォーテーション括りにする。
MySQL の場合、、、
対象列が、NOT NULL制約がある場合、
CONCAT('"',
GROUP_CONCAT(REGEXP_REPLACE(task_name, '"', '""')
ORDER BY create_date DESC
SEPARATOR '","'),
'"') AS task_name_csv
対象列が、NOT NULL制約がない場合、
CONCAT('"',
GROUP_CONCAT(REGEXP_REPLACE(COALESCE(task_name, ''), '"', '""')
ORDER BY create_date DESC
SEPARATOR '","'),
'"') AS task_name_csv
PostgreSQLの場合、、、
対象列が、NOT NULL制約がある場合、
'"' || STRING_AGG(REGEXP_REPLACE(task_name, '"', '""', 'g'), '","' ORDER BY create_date DESC)
|| '"' AS task_name_csv
対象列が、NOT NULL制約がない場合、
'"' || STRING_AGG(REGEXP_REPLACE(COALESCE(task_name, ''), '"', '""', 'g'), '","' ORDER BY create_date DESC)
|| '"' AS task_name_csv
しかし、PostgreSQL には、列の型に、ARRAY型が存在するわけで、
PostgreSQL は、わざわざ、このようなことはしないで、ARRAY型にして SELECT すれば、
こんなCSVを生成した結果をSELECTで取り込んで、
先日書いたJavaのメソッドでリストにするなんてことをする必要性はない。
ARRAY_AGG(task_name ORDER BY create_date DESC)
あるいは、
ARRAY_AGG(COALESCE(task_name, '') ORDER BY create_date DESC)
GROUP_CONCAT結果をCSVにするなんて、MySQLだけしか有効性はないであろう。
=============================================================
ARRAY型で、思い起こせばこんなことを書いていた。。。
int[] → ArrayTypeHandler - Oboe吹きプログラマの黙示録
配列型に対するmybatis の TypeHandler よく使いそうなものを作った - Oboe吹きプログラマの黙示録
arraytypehandler · yipuran/yipuran-mybatis Wiki · GitHub