回答編集履歴

5

推敲

2018/06/13 14:22

投稿

sazi
sazi

スコア25138

test CHANGED
@@ -14,7 +14,7 @@
14
14
 
15
15
  --
16
16
 
17
- いったんバラして、再創生構成にしてみました。
17
+ いったんバラして、たたみ直す構成にしてみました。
18
18
 
19
19
  要件が分かりませんが、必要に応じて加工すれば、目的は果たすはず。
20
20
 

4

追記

2018/06/13 14:22

投稿

sazi
sazi

スコア25138

test CHANGED
@@ -49,3 +49,65 @@
49
49
  where sub_cd like '%222%'
50
50
 
51
51
  ```
52
+
53
+ #データ
54
+
55
+ ```SQL
56
+
57
+ CREATE TABLE tbl
58
+
59
+ (cd varchar2(2), sub_cd varchar2(11))
60
+
61
+ ;
62
+
63
+ INSERT ALL
64
+
65
+ INTO tbl (cd, sub_cd)
66
+
67
+ VALUES ('A1', '111,222,333')
68
+
69
+ INTO tbl (cd, sub_cd)
70
+
71
+ VALUES ('A2', '222,444')
72
+
73
+ INTO tbl (cd, sub_cd)
74
+
75
+ VALUES ('A3', '222')
76
+
77
+ SELECT * FROM dual
78
+
79
+ ;
80
+
81
+ ```
82
+
83
+ #tbl_expand
84
+
85
+ CD|SUB_CD
86
+
87
+ |:--|:--|
88
+
89
+ A1|111
90
+
91
+ A1|222
92
+
93
+ A1|333
94
+
95
+ A2|222
96
+
97
+ A2|444
98
+
99
+ A3|222
100
+
101
+
102
+
103
+ #tbl_contract
104
+
105
+ CD|SUB_CD
106
+
107
+ |:--|:--|
108
+
109
+ A1|111,222,333
110
+
111
+ A2|222,444
112
+
113
+ A3|222

3

追記

2018/06/13 12:20

投稿

sazi
sazi

スコア25138

test CHANGED
@@ -9,3 +9,43 @@
9
9
  where sub_cd like '%222%'
10
10
 
11
11
  ```
12
+
13
+ 追記
14
+
15
+ --
16
+
17
+ いったんバラして、再創生する構成にしてみました。
18
+
19
+ 要件が分かりませんが、必要に応じて加工すれば、目的は果たすはず。
20
+
21
+ ```SQL
22
+
23
+ with
24
+
25
+ tbl_expand as (-- sub_cdを展開。その際に重複が除外される。
26
+
27
+ select distinct cd, trim(regexp_substr(sub_cd, '[^,]+', 1, level)) sub_cd
28
+
29
+ from tbl
30
+
31
+ connect by instr(sub_cd, ',', 1, level - 1) > 0
32
+
33
+ )
34
+
35
+ , tbl_contract as (-- 展開したものを再度折りたたむ
36
+
37
+ select cd, listagg(sub_cd, ',') within group(order by sub_cd) sub_cd
38
+
39
+ from tbl_expand
40
+
41
+ group by cd
42
+
43
+ )
44
+
45
+ select listagg(cd || ',' || sub_cd, ',') within group(order by cd)
46
+
47
+ from tbl_contract
48
+
49
+ where sub_cd like '%222%'
50
+
51
+ ```

2

訂正

2018/06/13 11:41

投稿

sazi
sazi

スコア25138

test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  ```SQL
4
4
 
5
- select listagg(cd || ',' || sub_cd) within group(order by cd)
5
+ select listagg(cd || ',' || sub_cd, ',') within group(order by cd)
6
6
 
7
7
  from tbl
8
8
 

1

追記

2018/06/13 08:33

投稿

sazi
sazi

スコア25138

test CHANGED
@@ -1,3 +1,5 @@
1
+ oracle 11g以降であれば、listagg()が使用できます。
2
+
1
3
  ```SQL
2
4
 
3
5
  select listagg(cd || ',' || sub_cd) within group(order by cd)