11
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

All About Group(株式会社オールアバウト)Advent Calendar 2017

Day 4

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

Last updated at Posted at 2017-12-03

概要

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行目と最終行で '('')' を付け加えている。

11
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?