評価式は、たとえばSELECT コマンドのターゲットリストとして、INSERT や UPDATE の新しい列の値として、もしくはいくつかのコマンドの検索条件としてさまざまな文脈のなかで使われます。評価式の結果は、テーブル式の結果(つまりテーブル)から区別するために、スカラーと呼ばれることもあります。したがって、評価式はスカラー式 (もしくはもっと簡単に式)とも呼ばれます。式の構文によって、算術、論理、集合などの演算を行う基本的な部分で値の計算を行うことができます。
評価式は下記のうちのどれかです。
定数あるいはリテラル値(Section 1.1.2を参照)。
列の参照。
関数宣言の本体における、位置パラメータ参照。
演算子の呼び出し
関数の呼び出し。
集約式
型キャスト
スカラー副問い合わせ
( expression )
かっこ(副式をまとめ優先順位を変更するために使われます)。
これ以外にも、式として分類されるけれども一般的な構文ルールには従わないいくつかの構成要素があります。これらは一般的に関数あるいは演算子の意味を持ちます。Chapter 4で説明されていますが、例をあげると IS NULL があります。
Section 1.1.2ですでに定数については説明しました。続く節では残りのオプションについて説明します。
列は下記のような形式で参照することができます。
correlation.columnname `['subscript`]'
correlation(相関名)は、テーブル名、FROM 句で定義されたテーブルの別名、キーワード NEW、キーワード OLD のいずれかです(NEWとOLDはルールのアクション部分でしか使えませんが、他の相関名はどのSQL文でも使うことができます)。相関名と区切り用のドットは、もし列名が現在の問い合わせで使われるすべてのテーブルを通して一意である場合は省略してもかまいません。もし columnname が配列型の場合には、オプションの subscript(配列要素)で配列から特定の1つまたは複数の要素を選択します。もし配列要素が提供されない場合、配列全体が選択されます。(配列についての詳細は Chapter 6 を参照して下さい。)
位置パラメータの参照は SQL 関数のパラメータを示すために使われます。これは典型的に SQL 関数定義ステートメントで使われます。パラメータの形式は以下です。
$number
たとえば、関数 dept の定義が以下のようにされたとします。
CREATE FUNCTION dept (text) RETURNS dept AS 'SELECT * FROM dept WHERE name = $1' LANGUAGE SQL;
ここでは $1 は関数が呼び出されるときに最初の関数引数によって置き換えられます。
演算子の呼び出しには以下の 3 構文が可能です。
expression operator expression(二項中置演算子) |
operator expression(単項前置演算子) |
expression operator(単項後置演算子) |
関数呼び出しの構文は関数名(これは Section 1.1.1の識別子の構文ルールの対象です)のあとにかっこで閉じた引数リストがあるものです。
function ([expression [, expression ... ]] )
たとえば、以下のものは 2 の平方根を計算します。
sqrt(2)
組み込み関数のリストはChapter 4にあります。他の関数はユーザによって追加できます。
集約式は、問い合わせによって選択される行に対して集約関数が適用されることを意味します。集約関数は、たとえば入力の合計や平均などのように、複数の入力を単一の出力値にします。集計式の構文は下記のうちのいずれかです。
aggregate_name (expression) |
aggregate_name (ALL expression) |
aggregate_name (DISTINCT expression) |
aggregate_name ( * ) |
集約式の最初の形式は、与えられた式が非 NULL 値を生み出すすべての入力行で、集計を呼び出します(実際は、NULLを無視するかどうかは集約関数しだいですが、すべての標準のものは無視します)。二番目の形式は ALL がデフォルトなので最初のものと同じです。三番目の形式は、入力行の中で見つけられる式のすべての別個の非 NULL 値のための集計を呼び出します。最後の形式は NULL か非 NULL 値かにかかわらず、それぞれの入力行に対して一回ずつ集計を呼び出します。特定の入力値が指定されていないため、これは一般的に count() 集約関数でのみ役に立ちます。
たとえば、count(*) は入力行の合計数を出します。count(f1) は f1 が非 NULL である入力行の数を出します。count(distinct f1) は f1 の別個の非 NULL 値の数を出します。
すでに定義された集約関数は Section 4.14で説明されています。他の集約関数はユーザによって追加することができます。
型キャストは、あるデータ型から他のデータ型への変換を指定します。 PostgreSQL は型キャストに 2 つの等価な構文を受け付けます。
CAST ( expression AS type ) expression::type
CAST 構文はS QL92 に従います。 :: を使用した構文は PostgreSQL で昔から使用されています。
キャストが既知の型の評価式に適用された場合、それは実行時型変換を表します。このキャストは、適切な型変換関数が使用可能であれば成功します。Section 1.1.2.5 で示すように、これと定数のキャストの使用との微妙な違いに注意して下さい。修飾されていない文字列リテラルに対するキャストは、リテラル定数値の初期に割り当てられる型を表します。ですから、これは(文字列リテラル定数の内容がそのデータ型の入力構文で受け付けられるのであれば)全ての型で成功します。
(例えば、テーブル列への代入時など)評価式が生成しなければならない型に曖昧さがない場合、明示的な型キャストは省略することができます。その場合、システムは自動的に型キャストを適用します。
また、関数のような構文を使用して型キャストを指定することもできます。
typename ( expression )
しかし、これはその型の名前が関数の名前としても有効な場合にのみ動作します。例えば、double precision はこの方式を使用できませんが、等価な float8 では可能です。また、interval、time、 timestamp では、パーサ内部で衝突しますので、それらを二重引用符で括った場合にのみ、この方式を使用することができます。このように、この関数のようなキャスト構文は一貫性がなくなりますので、おそらくは新しいアプリケーションでは使用すべきではありません。
スカラー副問い合わせは、正確に 1 行 1 列を返す、括弧内の通常の SELECTです。その SELECT 問い合わせは実行され、返される 1 つの値はその値の前後の評価式で使用されます。1 行を越える行や 1 列を越える列がスカラー副問い合わせの問い合わせとして使用された場合はエラーになります。(しかし、特定の式では、副問い合わせが行を返さない場合でもエラーとはなりません。そのスカラー結果は NULL として扱われます。)問い合わせは、その回りの問い合わせ内の値を参照することができます。その値は副問い合わせの評価時には定数として扱われます。Section 4.15 も参照して下さい。
例えば、以下は各州で最も人口の多い都市を検索します。
SELECT name, (SELECT max(pop) FROM cities WHERE cities.state = states.name) FROM states;