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