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

回答編集履歴

3

推敲

2020/07/17 07:44

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -18,7 +18,7 @@
18
18
  ```SQL
19
19
  CREATE OR REPLACE FUNCTION get_list_users(
20
20
  ary text[]
21
- , group_id uuid
21
+ , groupid uuid
22
22
  )
23
23
  RETURNS void
24
24
  AS $BODY$
@@ -29,21 +29,21 @@
29
29
  -- 配列の数だけループ
30
30
  FOR i IN 1..array_length(ary, 1) LOOP
31
31
  insert into user_group(user_id, group_id)
32
- values (ary[i], group_id)
32
+ values (ary[i], groupid)
33
33
  ;
34
34
  END LOOP;
35
35
  */
36
36
  /*
37
37
  -- 配列を行に展開してループ
38
- FOR wr IN select * from unnest(ary) as w(user_id) LOOP
38
+ FOR wr IN select * from unnest(ary) as w(userid) LOOP
39
39
  insert into user_group(user_id, group_id)
40
- values (wr.user_id, group_id)
40
+ values (wr.userid, groupid)
41
41
  ;
42
42
  END LOOP;
43
43
  */
44
44
  -- 配列を行に展開してそのままinsert
45
45
  insert into user_group(user_id, group_id)
46
- select user_id, group_id from unnest(ary) as w(user_id)
46
+ select userid, groupid from unnest(ary) as w(userid)
47
47
  ;
48
48
  return;
49
49
  END;
@@ -54,6 +54,6 @@
54
54
  ```SQL
55
55
  select get_list_users(
56
56
  ary :=array['test01', 'test02', 'test03'] ::text[]
57
- ,group_id :='64cca920-726a-4298-8cf9-66e93d8c7ba1' ::uuid
57
+ ,groupid :='64cca920-726a-4298-8cf9-66e93d8c7ba1' ::uuid
58
58
  )
59
59
  ```

2

推敲

2020/07/17 07:43

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -40,7 +40,7 @@
40
40
  values (wr.user_id, group_id)
41
41
  ;
42
42
  END LOOP;
43
- /*
43
+ */
44
44
  -- 配列を行に展開してそのままinsert
45
45
  insert into user_group(user_id, group_id)
46
46
  select user_id, group_id from unnest(ary) as w(user_id)

1

追記

2020/07/17 00:40

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -1,4 +1,59 @@
1
1
  [unnest()](https://www.postgresql.jp/document/12/html/functions-array.html)を使用すれば配列を行に展開できます。
2
2
  **WITH ORDINALITY**を付加すれば、連番も返却されます。
3
3
 
4
- loopするよりSQLで直接insertなりを行う方が手間が掛からないと思います。
4
+ loopするよりSQLで直接insertなりを行う方が手間が掛からないと思います。
5
+
6
+ 追記
7
+ --
8
+ insert対象のテーブルの定義を以下とします
9
+ ```SQL
10
+ create table user_group(
11
+ id serial
12
+ , user_id text
13
+ , group_id uuid
14
+ );
15
+ ```
16
+ 以下はストアドの定義です。(戻り値は無しです)
17
+ 3パターン記述していますが、2つはコメントアウトしています。
18
+ ```SQL
19
+ CREATE OR REPLACE FUNCTION get_list_users(
20
+ ary text[]
21
+ , group_id uuid
22
+ )
23
+ RETURNS void
24
+ AS $BODY$
25
+ DECLARE
26
+ wr record;
27
+ BEGIN
28
+ /*
29
+ -- 配列の数だけループ
30
+ FOR i IN 1..array_length(ary, 1) LOOP
31
+ insert into user_group(user_id, group_id)
32
+ values (ary[i], group_id)
33
+ ;
34
+ END LOOP;
35
+ */
36
+ /*
37
+ -- 配列を行に展開してループ
38
+ FOR wr IN select * from unnest(ary) as w(user_id) LOOP
39
+ insert into user_group(user_id, group_id)
40
+ values (wr.user_id, group_id)
41
+ ;
42
+ END LOOP;
43
+ /*
44
+ -- 配列を行に展開してそのままinsert
45
+ insert into user_group(user_id, group_id)
46
+ select user_id, group_id from unnest(ary) as w(user_id)
47
+ ;
48
+ return;
49
+ END;
50
+ $BODY$
51
+ LANGUAGE PLpgSQL;
52
+ ```
53
+ 以下のような呼び出しです。
54
+ ```SQL
55
+ select get_list_users(
56
+ ary :=array['test01', 'test02', 'test03'] ::text[]
57
+ ,group_id :='64cca920-726a-4298-8cf9-66e93d8c7ba1' ::uuid
58
+ )
59
+ ```