質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

解決済

1回答

7283閲覧

psqlで配列にloopを回したい。

toriumi_haru

総合スコア26

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

0クリップ

投稿2020/07/15 12:12

編集2020/07/16 13:00

はじめに

ストアドプロシージャに引数を渡して実行することを考えています。
表現が適切ではなかったらすみません。↑
例えばなのですが、

ruby

1sql = <<SQL 2select 3 * 4from 5 get_list_users( 6 ary := ary 7 ,group := group_id 8) 9SQL 10 11find_by_sql(sql,ary,group_id)

このような感じで呼び出して実行しようと思っています。
get_list_users.sqlファイルに詳しいsqlが書いてあってそこに引数で配列を渡してloopを回したいです。

###やりたいこと
get_list_users.sqlのなかで
aryの先頭を取り出して

idaryのデータgroup
1array.[0]64cca920-726a-4298-8cf9-66e93d8c7ba1
2array.[1]64cca920-726a-4298-8cf9-66e93d8c7ba1
3array.[2]64cca920-726a-4298-8cf9-66e93d8c7ba1

このように保存したいです。

psqlで書くことはできますでしょうか?
よろしくお願いします。
psqlでの型はaryがTEXT[],group_idがUUIDです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/07/15 12:15

タグにないですがRuby前提でしょうか?
toriumi_haru

2020/07/15 12:18

ruby前提ではないです! 自分が思う「ストアドプロシージャを呼び出して実行」を見ていただいて認識に齟齬がないようにしたかったです。 実際にストアドプロシージャを呼び出すコードはrustなのですが今困っていることとしては sql側で受け取った配列にループを回すことができるのか 質問内容の表のようにデータを登録するにはどうしたらいいのか で困っていました!
toriumi_haru

2020/07/15 12:19

どのようなsqlを書けばいいのかで困っています!
guest

回答1

0

ベストアンサー

unnest()を使用すれば配列を行に展開できます。
WITH ORDINALITYを付加すれば、連番も返却されます。

loopするよりSQLで直接insertなりを行う方が手間が掛からないと思います。

追記

insert対象のテーブルの定義を以下とします

SQL

1create table user_group( 2 id serial 3, user_id text 4, group_id uuid 5);

以下はストアドの定義です。(戻り値は無しです)
3パターン記述していますが、2つはコメントアウトしています。

SQL

1CREATE OR REPLACE FUNCTION get_list_users( 2 ary text[] 3 , groupid uuid 4) 5RETURNS void 6AS $BODY$ 7DECLARE 8 wr record; 9BEGIN 10/* 11 -- 配列の数だけループ 12 FOR i IN 1..array_length(ary, 1) LOOP 13 insert into user_group(user_id, group_id) 14 values (ary[i], groupid) 15 ; 16 END LOOP; 17*/ 18/* 19 -- 配列を行に展開してループ 20 FOR wr IN select * from unnest(ary) as w(userid) LOOP 21 insert into user_group(user_id, group_id) 22 values (wr.userid, groupid) 23 ; 24 END LOOP; 25*/ 26 -- 配列を行に展開してそのままinsert 27 insert into user_group(user_id, group_id) 28 select userid, groupid from unnest(ary) as w(userid) 29 ; 30 return; 31END; 32$BODY$ 33LANGUAGE PLpgSQL;

以下のような呼び出しです。

SQL

1select get_list_users( 2 ary :=array['test01', 'test02', 'test03'] ::text[] 3 ,groupid :='64cca920-726a-4298-8cf9-66e93d8c7ba1' ::uuid 4)

投稿2020/07/15 12:33

編集2020/07/17 07:44
sazi

総合スコア25327

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

toriumi_haru

2020/07/15 12:40

insertでどのように書いたらいいでしょうか? group_idも登録したいのですが unnest()を使用した後どのようにすればいいかが想像つきません。 もう少し教えていただけないでしょうか?
sazi

2020/07/15 14:40 編集

ではそのストアドの中身は良いとして、型が分かるように、パラメータなどの外観を質問に追記して下さい。
sazi

2020/07/17 01:02 編集

追記しました。 find_by_sql()については、insert用のストアドを呼び出すSQLを渡して、何をしようとしているか分かりませんが。 insertと検索を同時に実行?
toriumi_haru

2020/07/18 04:47

ありがとうございました! 丁寧に教えていただいて助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問