SQL
SQLServer

【SQLServer】(記事ID,ページ番号),(記事ID,ページ番号), ・・・のように組み合わせデータをカンマ区切りで出力するSQL

More than 1 year has passed since last update.

概要

SQLServerに記事本文データが入っているテーブル「article_pages」があったとして、
記事IDページ番号の組み合わせの一覧を、
(記事ID,ページ番号),(記事ID,ページ番号), ・・・
のような形式でカンマ区切りで出力したいときのSQLを作ってみた。

結論

こんなSQLになった。

SQL
SELECT '(' +
       REPLACE (
           (
              SELECT CONVERT(varchar, article_id) + ',' + CONVERT(varchar, page_number) AS [data()]
              FROM article_pages
              FOR XML PATH ('')
           ),
           ' ',
           '),('
       )
+ ')'

解説

CONVERT(varchar, article_id) + ',' + CONVERT(varchar, page_number)

単に、記事IDとページ番号をカンマで連結して記事ID,ページ番号という文字列を作成。
article_idやpage_numberがintで保存してあったので、varcharへの変換もしている。

data()FOR XML PATH ('')

data()FOR XML PATH ('')の合せ技で、下記のようなデータが取得できる。

SQL
SELECT CONVERT(varchar, article_id) + ',' + CONVERT(varchar, page_number) AS [data()]
FROM article_pages
FOR XML PATH ('')

出力データ("記事ID,ページ番号"がスペース区切りで出力されている)
記事ID,ページ番号 記事ID,ページ番号 記事ID,ページ番号 ・・・

REPLACE

スペース区切りで出力されたデータのスペースを ),( に置換。
これだけだと出力データの先頭と末尾の括弧が足りないので、SQLの1行目と最終行で '('')' を付け加えている。