評価式は、例えばSELECTコマンドの目的リストとして、INSERTやUPDATEの新しい列の値として、もしくはいくつかのコマンドの検索条件として様々な文脈の中で使われます。評価式の結果は、テーブル式の結果(つまりテーブル)から区別するために、スカラと呼ばれることもあります。したがって、評価式はスカラ式(またはもっと簡単に式)とも呼ばれます。演算を行う基本的な部分で値の計算を行うことができます。評価式は下記のうちのいずれかです。演算子の呼び出し関数呼び出し集約式ウィンドウ関数呼び出し型キャスト照合順序(collation)式スカラ副問い合わせ配列コンストラクタ行コンストラクタ(副式をグループ化したり優先順位を変更するのに使用される)括弧で囲まれた別の評価式これ以外にも、式として分類されるけれども一般的な構文規約には従わない、いくつかの構成要素があります。これらは一般的に関数あるいは演算子の意味を持ちます。第9章の該当部分で説明されています。NULL句があります。項4.1.2で既に定数については説明しました。続く節では残りのオプションについて説明します。列は、下記のような形式で参照することができます。correlation.columnnamecorrelationは、テーブル名(スキーマで修飾されている場合もあります)、あるいはFROM句で定義されたテーブルの別名です。相関名と区切り用のドットは、もし列名が現在の問い合わせで使われる全てのテーブルを通して一意である場合は省略することができます。(第7章も参照してください)。位置パラメータ位置パラメータ参照は、外部からSQL文に渡される値を示すために使用されます。パラメータはSQL関数定義およびプリペアド問い合わせの中で使用されます。クライアントライブラリの中には、SQLコマンド文字列とデータ値を分離して指定できる機能をサポートするものもあります。この場合、パラメータは行外データ値を参照するために使用されます。パラメータ参照の形式は以下の通りです。定義が以下のようにされたとします。SQL;ここで$1は関数が呼び出される時に最初の関数引数の値を参照します。配列の値を与える式の場合、特定の配列要素の値は以下のように記述することで展開されます。expression[subscript]また、複数の要素をまたがる("配列の一部分")場合は以下のように記述することで展開されます。]はリテラルとして現れています。各subscriptは自身が式であり、整数値を生成しなければなりません。一般的には、配列expressionは括弧で括らなければなりませんが、添字が付いた式が単なる列参照や位置パラメータであった場合、その括弧を省略することができます。mytable.arraycolumn[4]mytable.two_d_column[17][34]$1[10:42](arrayfunction(a,b))[42]最後の例では括弧が必要です。配列の詳細は項8.15を参照してください。式が複合型(行型)の値を生成する場合、行の特定のフィールドは以下のように記述することで展開できます。expression.fieldname一般的には、行expressionは括弧で括らなければなりません。選択元となる式が単なるテーブル参照や位置パラメータの場合、括弧を省略することができます。mytable.mycolumn$1.somecolumn(rowfunction(a,b)).col3(したがって、修飾された列参照は実際のところ、単なるこのフィールド選択構文の特殊な場合です。)重要となる特殊な場合としては、複合型のテーブル列からフィールドを抽出するときです。(compositecol).somefield(mytable.compositecol).somefieldcompositecolがテーブル名でなく列名であること、または2番目の場合のmytableがスキーマ名でなくテーブル名であることを示すため丸括弧が要求されます。SELECT列のリスト(項7.3参照)に.*を記述することで、複合型の全ての値を問い合わせることが可能です。演算子の呼び出し演算子の呼び出しには以下の3構文が可能です。(単項後置演算子)ここでoperatorトークンは、項4.1.3構文規則に従うもの、もしくはキーワードAND、OR、NOTのいずれか、または以下の形式の修飾された演算子名です。OPERATOR(schema.operatorname)具体的にどんな演算子が存在し、それが単項か二項かどうかは、システムやユーザによってどんな演算子が定義されたかに依存します。第9章にて、組み込み演算子について説明します。関数呼び出し関数呼び出しの構文は、関数名(スキーマ名で修飾されている場合があります)に続けてその引数を丸括弧で囲んで列挙したものです。)例えば、以下のものは2の平方根を計算します。sqrt(2)組み込み関数の一覧は第9章にあります。他の関数はユーザが追加できます。引数には名前を任意で付与することができます。詳細は項4.3を見て下さい。複合型の単一引数をとる関数はフィールド選択構文をオプショナルに使って呼び出すことができます。反対に関数形式でフィールド選択を記述することもできます。この記述方法はcol(table)やtable.colとなり、どちらを使っても変わりありません。PostgreSQLでは"計算された領域"のエミュレートをする関数の利用が可能なため、これはSQL標準の振る舞いではなくPostgreSQL独自機能となります。詳しくは項35.4.3を参照してください。集約式は、問い合わせによって選択される行に対して集約関数が適用されることを意味します。集約関数は、例えば入力の合計や平均などのように、複数の入力を単一の出力値にします。集約式の構文は下記のうちのいずれかです。集約式の最初の構文は、それぞれの入力行に対して1回ずつ集計を呼び出します。ALLはデフォルトなので、2つ目の形式は最初の形式と同じです。3番目の形式は、入力行の中にある式の、全ての重複しない値(複数式では重複しない値集合)の集約を呼び出します。最後の形式はそれぞれの入力行に対して1回ずつ集約を呼び出します。具体的な入力値が指定されていないため、これは一般的にcount(*)集約関数でのみ役に立ちます。1つ以上の式がNULLを返した場合にその行を破棄するように、ほとんどの集約関数はNULL入力を無視します。これは、特記されていない限り、すべての組込み集約で正しいと仮定することができます。count(*)は入力行の合計数を求めます。countはNULLを無視しますので、count(f1)はf1が非NULLである入力行の数を求めます。f1)はf1の重複しない非NULL値の数を求めます。通常、入力行は順序を指定されずに集計関数に与えられます。多くの場合では問題になりません。minは入力順序に関係なく同一の結果を返します。一部の集約関数(array_aggおよびstring_aggなど)は入力行の順序に依存した結果を返します。した集約関数を使用する際は、省略可能なorder_by_clauseを使用して必要とする順序を指定できます。BY句と同じ構文を取りますが、その式は常に単なる式であり、出力列名や序数とすることはできません。BY句はすべての集約引数の後に指定することに注意してください。incorrectではありません。BYキーを持つ単一引数の集約関数の呼び出しを表しています。(2つ目のキーは定数なので役には立ちません。BY式が集約関数の通常の引数に一致しなければなりません。DISTINCTリストに含まれない式でソートすることはできません。BYの指定機能はPostgreSQL独自の拡張です。定義済みの集約関数は項9.20で説明されています。ユーザは他の集約関数を追加することができます。集約式は、SELECTコマンドの結果リストもしくはHAVING句内でのみ記述することができます。WHEREなどの他の句では許されません。これらの句は理論上集計結果が形成される前に評価されるためです。集約式が副問い合わせ(項4.2.11と項9.22を参照)内に現れた場合、通常集約は副問い合わせの行全体に対して評価します。その集約の引数が上位レベルの変数のみを持つ場合は例外です。その場合、上位問い合わせの行全体に対して評価します。全体として、その集約式は、その後、その集約を含む副問い合わせでは外部参照となり、その副問い合わせにおける評価に対しては定数として動作します。結果リストもしくはHAVING句にのみ現れるという制約は、その集約が属する問い合わせレベルに関連して適用されます。ウィンドウ関数呼び出しウィンドウ関数呼び出しは、問い合わせにより選択された行のある部分に渡って集約のような機能を実現することを表します。通常の集約関数呼び出しと異なり、これは選択された行を1つの行にグループ化することに束縛されず、各行は別途問い合わせ出力に残ります。BYリスト)に従った、現在の行のグループの一部となる行をすべてスキャンすることができます。ウィンドウ関数呼び出しの構文は以下のいずれかです。window_nameここで、window_definitionは以下の構文になります。]オプションのframe_clauseは次の中の1つです。frame_endここでframe_startおよびframe_endは以下のいずれかです。FOLLOWINGここで、expressionはそれ自身ウィンドウ関数呼び出しを含まないいかなる値式を表わします。BYと同じ構文と動作です。window_nameは、問い合わせのWINDOW句で定義された名前付きウィンドウ仕様への参照です。window_nameで参照されますが、同時に丸括弧の内部にウィンドウ名を書くことができ、そして順序付け句とフレーム句の両方またはいずれか一方を供給します(ここでこれらの句が供給されると、参照されたウィンドウにこれらの句があってはなりません)。後者の構文はWINDOW句の中の既存のウィンドウ名を変更するのと同じ規則に従います(詳細はSELECTマニュアルページを見てください)。frameを構成する行の集合を指定します。PRECEDINGとすることができない点、およびframe_endの選択は上のリストの中でframe_startの選択より先に記述することができない点です。PRECEDINGは許されません。BYによる順序付けに沿った現在行と同等となる最後の行までのフレームをセットします。BYが無い場合は全ての行であることを意味します。FOLLOWINGはパーティションの最後の行をフレームの終わりにすることを意味します。(RANGEあるいはROWSのモードに関わらずです。ROWは現在行をフレームの開始もしくは終了とすることを意味します。BYによる順序付けに沿った現在行の最初か最後と同等な行がフレームの開始もしくは終了となります。FOLLOWINGの形式は、現在のところROWSモードでのみ許可されています。これは、フレームの開始もしくは終了点となる現在行の前や後に、大量の行があることを意味します。valueは一切の変数、集計関数、あるいはウィンドウ関数を含まない整数式でなければなりません。NULLや負数も許可されませんが、現在行を選択することになる0は指定可能です。組み込みウィンドウ関数は表9-47に記載されています。その他のウィンドウ関数をユーザが追加することが可能です。全ての組み込み、またはユーザ定義の集約関数もウィンドウ関数として使用できます。y)のように、ウィンドウ関数として呼び出しパラメータのない集約関数を使用します。アスタリスク(*)は習慣的に非集約ウィンドウ関数には使われません。BYが使われることを許可しません。BY句の中でのみ許可されます。項7.2.4にあります。型キャスト型キャストは、あるデータ型から他のデータ型への変換を指定します。PostgreSQLは型キャストに2つの等価な構文を受け付けます。)expression::typeCAST構文はSQLに準拠したものです。::を使用する構文は、PostgreSQLで伝統的に使用されている方法です。キャストが既知の型の評価式に適用された場合、それは実行時型変換を表します。このキャストは、適切な型変換操作が定義されている場合のみ成功します。項4.1.2.7で示すように、これと定数のキャストの使用との微妙な違いに注意してください。修飾されていない文字列リテラルに対するキャストは、リテラル定数値の初期に割り当てられる型を表します。これは(文字列リテラル定数の内容がそのデータ型の入力構文で受け付けられるのであれば)全ての型で成功します。通常(例えばテーブル列への代入時など)、評価式が生成しなければならない型に曖昧さがない場合、明示的な型キャストは省略することができます。その場合、システムは自動的に型キャストを適用します。自動キャストは、システムカタログに"暗黙的に適用しても問題なし"と示されている場合にのみ実行されます。その他のキャストは明示的なキャスト構文で呼び出す必要があります。この制限は、知らないうちに変換が実行されてしまうことを防ぐためのものです。関数のような構文を使用して型キャストを指定することもできます。)しかし、これはその型の名前が関数の名前としても有効な場合にのみ動作します。この方式で使用できませんが、同等のfloat8は使用できます。interval、time、timestampという名前は、構文が衝突するため、二重引用符で括った場合にのみこの方式で使用できます。この関数のような構文は、実際には単なる関数呼び出しです。2つの標準的なキャスト構文のうちの1つが実行時変換で使用されると、この構文は登録済みの関数を内部的に呼び出して変換を実行します。慣習的に、これらの変換関数は自身の出力型と同じ名前を持ち、これにより、"関数のような構文"は背後にある変換用関数を直接呼び出す以上のことを行いません。移植性を持つアプリケーションが依存すべきものでないことは明確です。CASTを参照してください。照合順序式COLLATE句は式の照合順序規則を上書きします。適用するため次の様に式に加えます。collationcollationはおそらくスキーマ部を含む識別子です。COLLATE句は演算子よりも優先度が低いため、必要に応じて括弧で囲います。照合順序が何も指定されなければ、データベースシステムは式にある列から照合順序を取得します。列に関する照合順序が式になければ、データベースのデフォルトの照合順序を使います。例として、よく使われるCOLLATE句による並び替え順序の上書きを挙げます。