さまざまなオプション。
純粋なSQLで「変数」を持つようにCTEにパラメータを指定します :
WITH var(lastname) AS (SELECT 'Troy'::varchar(16))
SELECT *
FROM users, var v
WHERE lastname = v.lastname;
これはすべてで機能します クエリ。
CTEvar以降 単一行を保持します CROSS JOINを追加しても安全です FROM句の最後-明示的な結合構文はコンマの前にバインドされるため、実際にはコンマの後に追加する短い形式が最適な場合があります。追加のテーブルエイリアスv 構文をさらに短縮するためのオプションです。
または CTEなしでより安い。ところで、なぜvarchar(16) ? textを使用するだけです :
SELECT *
FROM users
JOIN (SELECT 'Troy'::text) var(lastname) USING (lastname)
WHERE lastname = var.lastname;
または 一時テーブルを使用する すべてに対して同様の役割を果たす 同じセッション内のクエリ。一時テーブルはセッションの終了とともに消滅します。
CREATE TEMP TABLE var AS
SELECT text 'Troy' AS lastname;
ANALYZE var; -- temp tables are not covered by autovacuum
SELECT * FROM users JOIN var USING (lastname);
- 一時テーブルと
autovacuumについて
または DOを使用できます @Houariのようなステートメントが提供されているか、ここに示されています:
- PostgreSQLは関数の外部をループします。それは可能ですか?
DOから値を返すことはできないことに注意してください ステートメント。 (RAISE ...を使用できます ただし、SELECTは使用できません。 plpgsqlにターゲットなし-DOのデフォルトの手続き型言語 声明。 SELECTを置き換えます PERFORMを使用 結果を破棄します。
または カスタマイズされたオプションを使用できます 、postgresql.confで設定できます グローバルに表示される 。
または セッションの期間中、同じセッションでのみ表示されるようにセッションに設定します :
SET my.lastname = 'Troy';
変数名は必須 ドットを含めます。 textに制限されています この方法ではデータ型として使用できますが、任意のデータ型をtextとして表すことができます。 ...
current_setting('my.lastname')を使用できます 値の式として。必要に応じてキャストします。例:current_setting('my.json_var')::json ...
または SET LOCALを使用します 現在のトランザクションの間だけ効果が持続するようにします 。参照:
- ユーザーIDをPostgreSQLトリガーに渡す
または 小さなIMMUTABLEを使用できます 機能 グローバルとして 特権ユーザーのみが操作できる永続化された変数。参照:
- PostgreSQLクエリで名前付き定数を定義する方法はありますか?
または クライアントとしてpsqlを使用する場合は、\setを使用します または\gset メタコマンドと変数置換。