回答編集履歴
5
推敲
test
CHANGED
@@ -14,7 +14,7 @@
|
|
14
14
|
|
15
15
|
--
|
16
16
|
|
17
|
-
いったんバラして、
|
17
|
+
いったんバラして、たたみ直す構成にしてみました。
|
18
18
|
|
19
19
|
要件が分かりませんが、必要に応じて加工すれば、目的は果たすはず。
|
20
20
|
|
4
追記
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
追記
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
訂正
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
追記
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)
|