演算子の優先順位と結合性はパーサに組み込まれています。 ほとんどの演算子は同じ優先順位を持ち左結合します。これは非直感的な 動作に導く可能性があります。例えばブーリアン演算子 "<" と ">" は、ブーリアン演算子 "<=" と ">=" とは違った優先順位を持ちます。さらに、二項と単項演算子を 組み合わせて使う場合は括弧を加える必要がある場合があります。 例えば下記のような場合です。
SELECT 5 ! - 6;これは下記のように解析されます。
SELECT 5 ! (- 6);なぜならパーサは、遅すぎる時点になるまで、! が中置ではなく接尾演算子として定義されていることに気づかないからです。 この場合、求める結果を得る為には下記のように書かなければいけません。
SELECT (5 !) - 6;これが拡張性に支払われる代償です。
Table 1-1. 演算子の優先順位 (減少)
演算子/要素 | 結合性 | 説明 |
---|---|---|
:: | 左 | Postgres方式の型キャスト |
[ ] | 左 | 配列要素選択 |
. | 左 | テーブル/カラム名の区切り |
- | 右 | 単項減算 |
^ | 左 | 羃乗 |
* / % | 左 | 積算、割算、モジュロ |
+ - | 左 | 加算、減算 |
IS | TRUE, FALSE, NULL かどうかを試す | |
ISNULL | NULL かどうかを試す | |
NOTNULL | NOT NULL かどうかを試す | |
(その他すべて) | 左 | その他全ての組み込み、あるいはユーザ定義の 演算子 |
IN | メンバーシップを設定する | |
BETWEEN | 囲み | |
OVERLAPS | 時間間隔の重複 | |
LIKE ILIKE | 文字列パターンのマッチング | |
< > | 小なり、大なり | |
= | 右 | 等しい、代入 |
NOT | 右 | 論理否定 |
AND | 左 | 論理積 |
OR | 左 | 論理和 |
演算子優先順位のルールは、上記で触れた組み込み演算子と同じ 名前を持つユーザ定義演算子にも当てはまります。例えばもし "+"演算子をあるカスタムデータ型に定義すると、 新しい演算子が何をするかに関わらず、 組み込まれた"+"演算子と同じ優先順位を持つように なります。