質問するログイン新規登録

回答編集履歴

5

推敲

2018/01/29 11:52

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  追記
10
10
  ---
11
- SQL Server2017なら、```STRING_AGG()```も使用できるので以下のようなサンプルになります。
11
+ SQL Server2017なら、[STRING_AGG()](http://sql55.com/query/generate-csv-string.php)も使用できるので[STRING_SPLIT()](http://sql55.com/query/split-string-bulit-in-function.php)と組み合わせて、以下のようなサンプルになります。
12
12
 
13
13
  ```SQL
14
14
  create table sample(user_id varchar(255), name varchar(255), color_list varchar(255));

4

推敲

2018/01/29 11:52

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  追記
10
10
  ---
11
- SQL Serverなら、```STRING_AGG()```も使用できるので以下のようなサンプルになります。
11
+ SQL Server2017なら、```STRING_AGG()```も使用できるので以下のようなサンプルになります。
12
12
 
13
13
  ```SQL
14
14
  create table sample(user_id varchar(255), name varchar(255), color_list varchar(255));

3

追記

2018/01/29 11:49

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -4,4 +4,29 @@
4
4
 
5
5
  SQL Server 2016以降なら、```STRING_SPLIT()```と```FOR XML PATH('')```の組み合わせでSQLのみでも何とかできますが、そもそもオプション値を1つのカラムに','区切りで格納しているのですから、それをSQL上でマスターで変換しようとするのは非効率です。
6
6
 
7
- SQLでの取得時に変換ではなく、データ取得後にphp側で変換したほうが良いと思います。
7
+ SQLでの取得時に変換ではなく、データ取得後にphp側で変換したほうが良いと思います。
8
+
9
+ 追記
10
+ ---
11
+ SQL Serverなら、```STRING_AGG()```も使用できるので以下のようなサンプルになります。
12
+
13
+ ```SQL
14
+ create table sample(user_id varchar(255), name varchar(255), color_list varchar(255));
15
+ create table color(color integer, colorname varchar(255));
16
+
17
+ insert into sample values('test1','test1_name','1,2'), ('test2','test2_name','1');
18
+ insert into color values(1,'ブラック'), (2,'ホワイト');
19
+ ```
20
+ ```SQL
21
+ select a.user_id, a.name
22
+ , STRING_AGG(c.colorname,',') as color_name_list
23
+ from (
24
+ select *, value as color
25
+ from sample OUTER APPLY STRING_SPLIT(color_list, ',')
26
+ ) a inner join color as c
27
+ on c.color = a.color
28
+ group by a.user_id, a.name
29
+ ```
30
+ STRING_SPLIT()によって','区切りの文字を行として展開し、マスターと結合。
31
+ 結合して取得した色の名称をSTRING_AGG()で行に纏める。
32
+ ※group by しているのは、一旦行として展開されているので、再度集約する必要が有る為。

2

推敲

2018/01/29 11:48

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -2,6 +2,6 @@
2
2
 
3
3
  上記エラーはSQL上で暗黙の型変換が行われ、オプションが一つのみ選択の場合は変換できるが、複数になると','で区切られているので型変換できないことによるエラーだと思われます。
4
4
 
5
- SQL Server 2016以降なら、```STRING_SPLIT()```と```FOR XML PATH('')```の組み合わせでSQLのみでも何とかできるかもしれせんが、そもそもオプション値を1つのカラムに','区切りで格納しているのですから、それをSQL上でマスターで変換しようとするのは非効率です。
5
+ SQL Server 2016以降なら、```STRING_SPLIT()```と```FOR XML PATH('')```の組み合わせでSQLのみでも何とかできまが、そもそもオプション値を1つのカラムに','区切りで格納しているのですから、それをSQL上でマスターで変換しようとするのは非効率です。
6
6
 
7
7
  SQLでの取得時に変換ではなく、データ取得後にphp側で変換したほうが良いと思います。

1

推敲

2018/01/29 05:32

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -2,6 +2,6 @@
2
2
 
3
3
  上記エラーはSQL上で暗黙の型変換が行われ、オプションが一つのみ選択の場合は変換できるが、複数になると','で区切られているので型変換できないことによるエラーだと思われます。
4
4
 
5
- SQL Server 2016以降なら、```STRING_SPLIT()```と```FOR XML PATH('')```の組み合わせでSQLのみでも何とかできるかもしれませんが、そもそもオプション値を1つのカラムに','区切りで格納しているのですから、それをマスターで変換しようとするのは非効率です。
5
+ SQL Server 2016以降なら、```STRING_SPLIT()```と```FOR XML PATH('')```の組み合わせでSQLのみでも何とかできるかもしれませんが、そもそもオプション値を1つのカラムに','区切りで格納しているのですから、それをSQL上でマスターで変換しようとするのは非効率です。
6
6
 
7
7
  SQLでの取得時に変換ではなく、データ取得後にphp側で変換したほうが良いと思います。