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

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

新規登録して質問してみよう
ただいま回答率
85.47%
PL/SQL

PL/SQL (Procedural Language/Structured Query Language) はOracle CorporationによるSQL(非手続き型言語)を手続き型言語に拡張させるために開発されたプログラミング言語です。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

1回答

3042閲覧

動的SQL文で複数行の結果を取得したい

g1081828

総合スコア8

PL/SQL

PL/SQL (Procedural Language/Structured Query Language) はOracle CorporationによるSQL(非手続き型言語)を手続き型言語に拡張させるために開発されたプログラミング言語です。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2019/10/19 04:59

前提・実現したいこと

下記のSQLのtest1テーブルとtest2テーブルを入力引数として複数行の取得結果を返すことを考えています。
入力引数をSQL文に埋め込む場合、動的SQLに変更することで対応できることが分かったのですが、書き方がわかりません。
よろしくお願いいたします。

該当のソースコード

CREATE OR REPLACE FUNCTION public.sabun(
)
RETURNS TABLE(id text, key1 text, key2 text)
LANGUAGE 'plpgsql'

COST 100 VOLATILE ROWS 1000

AS $BODY$
BEGIN
RETURN QUERY
SELECT * FROM
(
(SELECT b.id,
MAX(CASE b.key WHEN 'key1' THEN b.value ELSE '' END) AS "KEY1",
MAX(CASE b.key WHEN 'key2' THEN b.value ELSE '' END) AS "KEY2"
FROM
(SELECT test1.id, a.key, a.value FROM test1 JOIN json_each_text(test1.data::json) a ON true) b
GROUP BY b.id
ORDER BY b.id)
EXCEPT ALL
(SELECT c.id,c.key1,c.key2 FROM test2 c ORDER BY id)
) d
ORDER BY d.id;
END
$BODY$;

補足情報(FW/ツールのバージョンなど)

・plpgsql
・postgres 10

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

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

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

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

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

guest

回答1

0

ベストアンサー

入力引数をSQL文に埋め込む場合、動的SQLに変更することで対応できることが分かったのですが、書き方がわかりません。

動的SQLである必要はありません。SQL内からパラメータ名で参照できます。

42.3.1. 関数引数の宣言
以下引用

CREATE FUNCTION extended_sales(p_itemno int)
RETURNS TABLE(quantity int, total numeric) AS $$
BEGIN
RETURN QUERY SELECT s.quantity, s.quantity * s.price FROM sales AS s
WHERE s.itemno = p_itemno;
END;
$$ LANGUAGE plpgsql;

追記

質問のSQL自体は、以下の様に簡潔に記述できます。

SQL

1select id, data->>'key1' as key1, data->>'key2' as key2 from test1 2except all 3select id, key1, key2 from test2 4order by id

投稿2019/10/19 07:38

編集2019/10/19 08:42
sazi

総合スコア25206

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

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

g1081828

2019/10/19 11:02

ご回答ありがとうございます。 難しく考えてました。 また簡潔なSQL文も記載して頂きありがとうございます。勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問