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

回答編集履歴

5

推敲

2018/06/13 14:22

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -6,7 +6,7 @@
6
6
  ```
7
7
  追記
8
8
  --
9
- いったんバラして、再創生構成にしてみました。
9
+ いったんバラして、たたみ直す構成にしてみました。
10
10
  要件が分かりませんが、必要に応じて加工すれば、目的は果たすはず。
11
11
  ```SQL
12
12
  with

4

追記

2018/06/13 14:22

投稿

sazi
sazi

スコア25430

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

追記

2018/06/13 12:20

投稿

sazi
sazi

スコア25430

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

訂正

2018/06/13 11:41

投稿

sazi
sazi

スコア25430

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

追記

2018/06/13 08:33

投稿

sazi
sazi

スコア25430

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