さまざまなオプション。
純粋な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
メタコマンドと変数置換。