回答編集履歴

5

推敲

2018/01/29 11:52

投稿

sazi
sazi

スコア25195

test CHANGED
@@ -18,7 +18,7 @@
18
18
 
19
19
  ---
20
20
 
21
- SQL Server2017なら、```STRING_AGG()```も使用できるので以下のようなサンプルになります。
21
+ SQL Server2017なら、[STRING_AGG()](http://sql55.com/query/generate-csv-string.php)も使用できるので[STRING_SPLIT()](http://sql55.com/query/split-string-bulit-in-function.php)と組み合わせて、以下のようなサンプルになります。
22
22
 
23
23
 
24
24
 

4

推敲

2018/01/29 11:52

投稿

sazi
sazi

スコア25195

test CHANGED
@@ -18,7 +18,7 @@
18
18
 
19
19
  ---
20
20
 
21
- SQL Serverなら、```STRING_AGG()```も使用できるので以下のようなサンプルになります。
21
+ SQL Server2017なら、```STRING_AGG()```も使用できるので以下のようなサンプルになります。
22
22
 
23
23
 
24
24
 

3

追記

2018/01/29 11:49

投稿

sazi
sazi

スコア25195

test CHANGED
@@ -11,3 +11,53 @@
11
11
 
12
12
 
13
13
  SQLでの取得時に変換ではなく、データ取得後にphp側で変換したほうが良いと思います。
14
+
15
+
16
+
17
+ 追記
18
+
19
+ ---
20
+
21
+ SQL Serverなら、```STRING_AGG()```も使用できるので以下のようなサンプルになります。
22
+
23
+
24
+
25
+ ```SQL
26
+
27
+ create table sample(user_id varchar(255), name varchar(255), color_list varchar(255));
28
+
29
+ create table color(color integer, colorname varchar(255));
30
+
31
+
32
+
33
+ insert into sample values('test1','test1_name','1,2'), ('test2','test2_name','1');
34
+
35
+ insert into color values(1,'ブラック'), (2,'ホワイト');
36
+
37
+ ```
38
+
39
+ ```SQL
40
+
41
+ select a.user_id, a.name
42
+
43
+ , STRING_AGG(c.colorname,',') as color_name_list
44
+
45
+ from (
46
+
47
+ select *, value as color
48
+
49
+ from sample OUTER APPLY STRING_SPLIT(color_list, ',')
50
+
51
+ ) a inner join color as c
52
+
53
+ on c.color = a.color
54
+
55
+ group by a.user_id, a.name
56
+
57
+ ```
58
+
59
+ STRING_SPLIT()によって','区切りの文字を行として展開し、マスターと結合。
60
+
61
+ 結合して取得した色の名称をSTRING_AGG()で行に纏める。
62
+
63
+ ※group by しているのは、一旦行として展開されているので、再度集約する必要が有る為。

2

推敲

2018/01/29 11:48

投稿

sazi
sazi

スコア25195

test CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
 
8
8
 
9
- SQL Server 2016以降なら、```STRING_SPLIT()```と```FOR XML PATH('')```の組み合わせでSQLのみでも何とかできるかもしれせんが、そもそもオプション値を1つのカラムに','区切りで格納しているのですから、それをSQL上でマスターで変換しようとするのは非効率です。
9
+ SQL Server 2016以降なら、```STRING_SPLIT()```と```FOR XML PATH('')```の組み合わせでSQLのみでも何とかできまが、そもそもオプション値を1つのカラムに','区切りで格納しているのですから、それをSQL上でマスターで変換しようとするのは非効率です。
10
10
 
11
11
 
12
12
 

1

推敲

2018/01/29 05:32

投稿

sazi
sazi

スコア25195

test CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
 
8
8
 
9
- SQL Server 2016以降なら、```STRING_SPLIT()```と```FOR XML PATH('')```の組み合わせでSQLのみでも何とかできるかもしれませんが、そもそもオプション値を1つのカラムに','区切りで格納しているのですから、それをマスターで変換しようとするのは非効率です。
9
+ SQL Server 2016以降なら、```STRING_SPLIT()```と```FOR XML PATH('')```の組み合わせでSQLのみでも何とかできるかもしれませんが、そもそもオプション値を1つのカラムに','区切りで格納しているのですから、それをSQL上でマスターで変換しようとするのは非効率です。
10
10
 
11
11
 
12
12