Q1
これは最終的にPostgres 9.4の公式ドキュメントに追加されました:
PL/pgSQL 変数への値の割り当ては、次のように記述されます。
variable { := | = } expression;
[...] =PL/SQL準拠の代わりにequal()を使用できます:=。
Q2
=の代わりに使用する既知の結果はあり:=ますか?
はい、深刻な結果を招くケースがありました:名前付きパラメーターを使用した関数呼び出し-関連していますが、まったく同じではありません。
厳密に言えば、この場合の区別はSQLコードで行われます。しかし、それは無防備なプログラマーに対する学問的な違いです。1
関数を考えてみましょう:
CREATE FUNCTION f_oracle(is_true boolean = TRUE) -- correct use of "="
RETURNS text AS
$func$
SELECT CASE $1
WHEN TRUE THEN 'That''s true.'
WHEN FALSE THEN 'That''s false.'
ELSE 'How should I know?'
END
$func$ LANGUAGE sql;
余談です=が、関数定義での の正しい使用に注意してください。CREATE FUNCTIONこれは構文の一部であり、 SQL代入のスタイルです。2
名前付き表記による関数呼び出し:
SELECT * FROM f_oracle(is_true := TRUE);
Postgres は:=パラメーター割り当てとして識別され、すべて問題ありません。ただし:
SELECT * FROM f_oracle(is_true = TRUE);
は SQL 等値演算子であるため=、Postgres は呼び出しステートメントのコンテキストで SQL 式として解釈し、結果を名前のない位置パラメーターis_true = TRUEとして渡す前に評価を試みます。外側のスコープで識別子を探します。それが見つからない場合:is_true
ERROR: column "is_true" does not exist
それは幸運なケースであり、幸運なことに、一般的なケースでもあります。
外側のスコープにある場合(およびデータ型に互換is_true 性がある場合) は、関数によって受け入れられる結果をis_true = TRUE持つ有効な式です。booleanエラーは発生しません。明らかに、これはSQL等値演算子を使用するプログラマーの意図=です...
このSQL Fiddleはその効果を示しています。
と の違いを認識していないと、デバッグが非常に困難=です:=。
常に正しい演算子を使用してください。
1関数呼び出しで名前付き表記を使用する場合:=、正しい代入演算子はだけこれは、PL/pgSQL だけでなく、pg 9.4 までのすべての言語の関数に適用されます下記参照。
2= (またはDEFAULT) を
使用して、関数パラメーターのデフォルト値を定義できます。それは当面の問題とはまったく関係ありません。間違ったユースケースに非常に近いです。
Postgres 9.0 - 9.4: から:=への移行=>
名前付き関数パラメーターへの代入の SQL 標準は=>(そしてOracle の PL/SQL はそれを使用します。Postgres は同じことができませんでした。演算子は以前に予約解除されていたため、:=代わりに PL/pgSQL の代入演算子を使用しています。Postgres 9.0 のリリースにより、=>を他の目的で使用することは推奨されていません。リリース ノートによると:
演算子名としての => の使用を廃止します。 (Robert Haas)
PostgreSQL の将来のバージョンでは、名前付き関数パラメータの SQL 標準表記をサポートするために、おそらくこの演算子名を完全に拒否するでしょう。現時点ではまだ許可されていますが、そのような演算子が定義されている場合は警告が発せられます。
他の目的で使用する場合は、使用=>を中止してください。将来的に壊れます。
Postgres 9.5:=>今すぐ使用
このリリース以降、SQL 標準演算子=>が使用されます。:=下位互換性のために引き続きサポートされています。ただし、非常に古いバージョンで実行する必要のない新しいコードでは、標準演算子を使用してください。
これは、変更されていないplpgsql コードの代入演算子ではなく、関数呼び出し(SQL スコープ) の名前付きパラメーターの代入に適用されます。:=