回答編集履歴
5
推敲
answer
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
```
|
7
7
|
追記
|
8
8
|
--
|
9
|
-
いったんバラして、
|
9
|
+
いったんバラして、たたみ直す構成にしてみました。
|
10
10
|
要件が分かりませんが、必要に応じて加工すれば、目的は果たすはず。
|
11
11
|
```SQL
|
12
12
|
with
|
4
追記
answer
CHANGED
@@ -23,4 +23,35 @@
|
|
23
23
|
select listagg(cd || ',' || sub_cd, ',') within group(order by cd)
|
24
24
|
from tbl_contract
|
25
25
|
where sub_cd like '%222%'
|
26
|
-
```
|
26
|
+
```
|
27
|
+
#データ
|
28
|
+
```SQL
|
29
|
+
CREATE TABLE tbl
|
30
|
+
(cd varchar2(2), sub_cd varchar2(11))
|
31
|
+
;
|
32
|
+
INSERT ALL
|
33
|
+
INTO tbl (cd, sub_cd)
|
34
|
+
VALUES ('A1', '111,222,333')
|
35
|
+
INTO tbl (cd, sub_cd)
|
36
|
+
VALUES ('A2', '222,444')
|
37
|
+
INTO tbl (cd, sub_cd)
|
38
|
+
VALUES ('A3', '222')
|
39
|
+
SELECT * FROM dual
|
40
|
+
;
|
41
|
+
```
|
42
|
+
#tbl_expand
|
43
|
+
CD|SUB_CD
|
44
|
+
|:--|:--|
|
45
|
+
A1|111
|
46
|
+
A1|222
|
47
|
+
A1|333
|
48
|
+
A2|222
|
49
|
+
A2|444
|
50
|
+
A3|222
|
51
|
+
|
52
|
+
#tbl_contract
|
53
|
+
CD|SUB_CD
|
54
|
+
|:--|:--|
|
55
|
+
A1|111,222,333
|
56
|
+
A2|222,444
|
57
|
+
A3|222
|
3
追記
answer
CHANGED
@@ -3,4 +3,24 @@
|
|
3
3
|
select listagg(cd || ',' || sub_cd, ',') within group(order by cd)
|
4
4
|
from tbl
|
5
5
|
where sub_cd like '%222%'
|
6
|
+
```
|
7
|
+
追記
|
8
|
+
--
|
9
|
+
いったんバラして、再創生する構成にしてみました。
|
10
|
+
要件が分かりませんが、必要に応じて加工すれば、目的は果たすはず。
|
11
|
+
```SQL
|
12
|
+
with
|
13
|
+
tbl_expand as (-- sub_cdを展開。その際に重複が除外される。
|
14
|
+
select distinct cd, trim(regexp_substr(sub_cd, '[^,]+', 1, level)) sub_cd
|
15
|
+
from tbl
|
16
|
+
connect by instr(sub_cd, ',', 1, level - 1) > 0
|
17
|
+
)
|
18
|
+
, tbl_contract as (-- 展開したものを再度折りたたむ
|
19
|
+
select cd, listagg(sub_cd, ',') within group(order by sub_cd) sub_cd
|
20
|
+
from tbl_expand
|
21
|
+
group by cd
|
22
|
+
)
|
23
|
+
select listagg(cd || ',' || sub_cd, ',') within group(order by cd)
|
24
|
+
from tbl_contract
|
25
|
+
where sub_cd like '%222%'
|
6
26
|
```
|
2
訂正
answer
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
oracle 11g以降であれば、listagg()が使用できます。
|
2
2
|
```SQL
|
3
|
-
select listagg(cd || ',' || sub_cd) within group(order by cd)
|
3
|
+
select listagg(cd || ',' || sub_cd, ',') within group(order by cd)
|
4
4
|
from tbl
|
5
5
|
where sub_cd like '%222%'
|
6
6
|
```
|
1
追記
answer
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
oracle 11g以降であれば、listagg()が使用できます。
|
1
2
|
```SQL
|
2
3
|
select listagg(cd || ',' || sub_cd) within group(order by cd)
|
3
4
|
from tbl
|