随時翻訳を続けています。
expression
| expr ::= | expr binary-op expr | expr [NOT] like-op expr [ESCAPE expr] | unary-op expr | ( expr ) | column-name | table-name . column-name | database-name . table-name . column-name | literal-value | parameter | function-name ( expr-list | * ) | expr ISNULL | expr NOTNULL | expr [NOT] BETWEEN expr AND expr | expr [NOT] IN ( value-list ) | expr [NOT] IN ( select-statement ) | expr [NOT] IN [database-name .] table-name | [EXISTS] ( select-statement ) | CASE [expr] ( WHEN expr THEN expr )+ [ELSE expr] END | CAST ( expr AS type ) | expr COLLATE collation-name |
| like-op ::= | LIKE | GLOB | REGEXP | MATCH |
このセクションはほかのセクションと異なっています。 この文書の多くの他のセクションは、特定の SQL コマンドについて扱っています。 このセクションは、独立したコマンドについてではなく、 他のコマンドの部品である "expressions" について取り扱います。
SQLite は、優先度の高い方から低い方へ順に以下の二項演算子を認識します。
|| * / % + - << >> & | < <= > >= = == != <> IN AND OR
これらの単項演算子もサポートします。
- + ! ~ NOT
COLLATE 演算子は、単項後置演算子とみなせます。 COLLATE 演算子は、最も高い優先順位を持ちます。 それは常に、どのような単項前置演算子よりあるいは二項演算子よりも一層強く結合します。
単項演算子 [Operator +] は何もしません。 これは文字列、ナンバー、blob に適用でき、常に結果としてオペランドの値をそのまま返します。
等号演算子と不等号演算子には、2種類のバリエーションがあることに注意してください。 等号演算子は、= あるいは、 == のいずれかです。 不等号演算子は、!= あるいは、 <> のいずれかです。 || 演算子は、"concatenate" です。 これは、オペランドの2つの文字列をつなげて一つにします。 % 演算子は、左オペランドから右オペランドの剰余を出力します。
文字列の結果を返す || 結合演算子以外の すべての二進演算子の戻り値は、数値です。
リテラル値は、整数ナンバーあるいは浮動小数点ナンバーです。 指数表現がサポートされています。 ロケールでその役目のために "," を設定していたとしても、"." 文字は常に小数点として 使われます。 "," を小数点として使うと、構文上の曖昧さをもたらします。 文字列を一重引用符(')で括ると文字列定数を形成します。 パスカルのように続けて2つの一重引用符を記入すると、文字列中の一重引用符をコード化する ことができます。 バックスラッシュ文字を使う C 言語形式のエスケープは、標準 SQL ではないのでサポート されません。 BLOB リテラルは、"x" あるいは "X" 文字を前置した16進データを含む文字列リテラルです。 以下に例を示します。
X'53514C697465'
リテラル値は、トークン "NULL" の場合もあります。
パラメーターは、sqlite3_bind API を使って 実行時に書き込まれるリテラル値のために式内でプレースホルダーを指定します。 パラメーターには、いくつかの形式があります。
?NNN クエスチョンマークに続くナンバー NNN は、NNN 番目のパラメーター用に領域を確保 します。 NNN は、1から999の間でなくてはなりません。 ? 後ろに数字が続かないクエスチョンマークは、次の未使用のパラメータ用に領域を確保します。 :AAAA コロンに続く識別子名は、名前 AAAA とともに名前付きのパラメータ領域を確保します。 名前付きのパラメーターには、同じように番号が付けられます。 番号には、未使用の次の番号が割り当てられます。 混乱を避けるために、名前付きの パラメーターと番号付きのパラメーターは混ぜない方が良いです。 @AAAA "アット" 記号は完全にコロンのように機能します。 $AAAA ドル記号に続く識別子名は、名前 AAAA とともに名前付きのパラメータ領域を同様に確保します。 この場合の識別子名は、一つ以上の "::" とどんなテキストでも含む "(...)" で囲まれた サフィックスを含めることができます。 この構文は、Tcl プログラミング言語の変数名の形式です。
sqlite3_bind を使って値を割り当てた パラメーター以外は、NULL として取り扱われます。
LIKE 演算子は、パターンマッチングによる比較をします。 右オペランドはパターンを含み、 左側のオペランドはパターンをマッチさせる文字列を含みます。 パターン内のパーセント記号 % は、 文字列内のゼロかもっと多くのあらゆる文字の連続とマッチします。 パターン内のアンダースコア _ は、 文字列内のあらゆる一文字とマッチします。 その他のあらゆる文字は、大文字小文字の違いを無視してそれ自身にマッチします。 (SQLite には、7-bit Latin キャラクター用の upper/lower case しか認識しないというバグが あります。) 従って、LIKE 演算子は 8-bit iso8859 キャラクターあるいは UTF-8 キャラクター用に 大文字小文字の違いを識別します。 たとえば、'a' LIKE 'A' という式は TRUE ですが、 'æ' LIKE 'Æ' は、FALSE です。
オプションの ESCAPE 句が存在する場合、ESCAPE キーワードの後に続く式は、一文字から 成り立つ文字列と評価しなくてはなりません。 この文字は、リテラルのパーセントあるいはアンダースコア文字を含む LIKE パターン内で 使われる場合があります。 エスケープキャラクタに続くパーセント記号、アンダースコア、エスケープキャラクタは、 それぞれ、文字列内のパーセント記号、アンダースコア、エスケープキャラクタにマッチします。 二項 LIKE 演算子は、ユーザー関数 like(X,Y) を 呼び出すように実装されています。
LIKE 演算子は、大文字小文字の違いを識別せず、片側の大文字は別の側の小文字に対して マッチします。 (SQLite には、7-bit Latin キャラクター用の upper/lower case しか認識しないというバグが あります。 従って、LIKE 演算子は 8-bit iso8859 キャラクターあるいは UTF-8 キャラクター用に 大文字小文字の違いを識別します。 たとえば、'a' LIKE 'A' という式は TRUE ですが、 'æ' LIKE 'Æ' は、FALSE です。)
二項 LIKE 演算子はユーザー関数 like(X,Y) を呼び出すように実装されています。 ESCAPE 句が存在する場合、関数呼び出しに三番目のパラメーターが追加されます。 代替の like() SQL 関数が定義される場合、LIKE の機能は置き換えられます。
GLOB 演算子は、LIKE のように機能しますが、ワイルドカード展開のために Unix のファイル GROB の構文を使います。 もちろん、LIKE と違い、GROB は大文字と小文字の違いを識別します。 GLOB と LIKE の両方とも、テストの意味を反転させるために NOT キーワードを前置できます。 二項 GROB 演算子は、ユーザー関数 glob(X,Y) を 呼び出すように実装されており、その関数で置き換えることができます。
REGEXP 演算子は、regexp() ユーザー関数用の特殊な構文です。 regexp() ユーザー関数はデフォルトでは定義されないので、REGEXP 演算子を使用すると、通常、 エラーメッセージを返します。 実行時に "regexp" という名前のユーザー定義関数を追加すると、その関数はREGEXP 演算子を 実装するために呼び出されます。
MATCH 演算子は、match() ユーザー関数用の特殊な構文です。 デフォルトの match() 関数の実装は、例外を引き起こすだけで、全く何の役にも立ちません。 しかし、match() 関数は、さらに役立つロジックとともに拡張で置き換えることができます。
カラム名は、CREATE TABLE ステートメントで定義されたあらゆる名前、または、 特別な識別子である "ROWID"、"OID"、"_ROWID_" のうちどれか一つです。 これらの特別な識別子は、各テーブルの各行に関連付けられたユニークな整数キー("行キー")を 記述します。 特別な識別子は、CREATE TABLE で同名の実際のカラムが定義されない場合のみ参照されます。 行キーは、読み取り専用カラムのように機能します。 行キーは、UPDATE あるいは INSERT ステートメントで行キーの値が変更されない限り 通常のカラムのどこでも使うことができます。 "SELECT * ..." は、行キーを返しません。
SELECT ステートメントは、IN 演算子の右側のオペランドのいずれかとして、 スカラー量として、あるいは、EXISTS 演算子のオペランドとして出現できます。 スカラー量あるいは IN 演算子のオペランドとして使う場合、SELECT は、その結果内 に単一のカラムのみを持たなくてはいけません。 (UNION あるいは EXCEPT のようなキーワードと接続する)複合的な SELECT は認められます。 EXISTS 演算子に適用する場合、SELECT の結果セット内のカラムは無視され、 式は、一つ以上の行が存在するなら TRUE を返し、 結果セットが空の場合 FALSE を返します。 SELECT 式の項目が内包する問い合わせ内の値を参照しない場合、 他のすべての処理に先立って一度だけ評価され、結果が必要になると再利用されます。 SELECT 式が外側の問い合わせからの変数を含むなら、それが必要な時はいつも SELECT が 再評価されます。
SELECT が IN 演算子の右オペランドである時、左オペランドの結果が SELECT によって 生成された何らかの値であるなら、IN 演算子は TRUE を返します。 IN 演算子は、テストの意味を反転させるために NOT キーワードを前置することができます。
SELECT が式内に出現するが IN 演算子の右オペランドではない時、SELECT の結果の最初の行が 式で使われる値となります。 SELECT が複数の行を返す場合、最初の行以外は無視されます。 SELECT が行を返さない場合、SELECT の値は NULL です。
CAST 式は、 <type> で指定する型へ <expr> のデータ型を変更します。 <type> は、CREATE TABLE ステートメントで定義されたカラムの型で有効且つ空でない 型すべてが当てはまります。
シンプル関数と集約関数の両方をサポートします。 シンプル関数は、どのような式内でも使うことができます。 シンプル関数は、入力に基づいて即座に結果を返します。 集約関数は、SELECT ステートメント内でのみ使えます。 集約関数は、結果セットのすべての行を通して計算し、結果とします。
コア関数以下に示すコア関数は、デフォルトで利用できます。 追加の関数は、C 言語で書いて sqlite3_create_function() を使って データベースエンジンに追加できます。
| abs(X) | 引数 X の絶対値を返します。 |
| coalesce(X,Y,...) | NULL 以外の最初の引数のコピーを返します。 すべての引数が NULL の場合、NULL を返します。 少なくとも二つ以上の引数が必要です。 |
| glob(X,Y) | この関数は、SQLite の "X GLOB Y" 構文を実装するために使われます。 この関数を置き換え GLOB 演算子の動作を変更するために、 sqlite3_create_function() インターフェースが使えます。 |
| ifnull(X,Y) | NULL 以外の最初の引数のコピーを返します。 引数が両方とも NULL の場合、NULL を返します。 この関数は、上述の coalesce() と同じように動作します。 |
| hex(X) | 引数を BLOB として変換します。 戻り値は、その blob の内容の16進数表現です。 |
| last_insert_rowid() | このデータベース接続で挿入された最後の行の ROWID を返します。 これは、sqlite_last_insert_rowid() API が返すのと同じ値です。 |
| length(X) | X の文字列の長さを文字数で返します。 SQLite が UTF-8 をサポートするように設定していた場合、UTF-8 文字の数を返します。 バイト数ではありません。 |
|
like(X,Y) like(X,Y,Z) |
この関数は、SQL の "X LIKE Y [ESCAPE Z]" 構文を実装するために使われます。 オプションの ESCAPE 句が存在する場合、ユーザー関数が3つの引数で呼び出されます。 それ以外の場合、引数2つのみで呼び出されます。 この関数を置き換えて LIKE 演算子の動作を変えるために sqlite_create_function() インターフェースが使えます。 これを行う時、2引数版と3引数版の like() 関数を同時に置き換えることが重要です。 そうしなければ、ESCAPE 句が指定されているかどうかによって、異なるコードが LIKE 演算子を 実装するために呼び出されることになります。 |
| load_extension(X) load_extension(X,Y) |
X という名前の共有ライブラリファイルから Y というエントリーポイントを使って SQLite エクステンションをロードします。 戻り値は NULL です。 Y が省略された場合、sqlite3_extension_init のデフォルトの エントリーポイントが使われます。 この関数は、エクステンションのロードや適切な初期化に失敗した場合、 例外を引き起こします。 |
| lower(X) | すべての文字を小文字に変換して文字列 X のコピーを返します。 変換には、C ライブラリの tolower() ルーチンを使います。 これは、この関数が UTF-8 上では適切に機能しないことを意味します。 |
|
ltrim(X) ltrim(X,Y) |
Y に出現するすべての文字を X の左側から削除することによって構成される 文字列を返します。 Y 引数を省略すると、空白文字を削除します。 |
| max(X,Y,...) | 引数の最大値を返します。 引数は、数以外に文字列の場合もあります。 最大値は、通常のソート順で決定されます。 max() は2つ以上の引数をもつ時シンプル関数ですが、引数が一つだけ与えられたときは 集約関数に変換されることに注意してください。 |
| min(X,Y,...) | 引数の最小値を返します。 引数は、数以外に文字列の場合もあります。 最小値は、通常のソート順で決定されます。 min() は2つ以上の引数をもつ時シンプル関数ですが、引数が一つだけ与えられたときは 集約関数に変換されることに注意してください。 |
| nullif(X,Y) | 引数がそれぞれ異なるなら、最初の引数を返し、同じなら NULL を返します。 |
| quote(X) | このルーチンは、引数を別の SQL ステートメントに含めるのに適した値にした文字列を返します。 文字列は、必要とされるように内部引用符でエスケープされた上一重引用符で囲まれます。 VACUUM の現在の実装は内部で今関数を使います。 undo/redo 機能を実装するためにトリガーを書くとき、この関数が便利です。 |
| random(*) | -9223372036854775808 から +9223372036854775807 の間の擬似乱数を整数で返します。 |
| replace(X,Y,Z) | 文字列 X 内から文字列 Y に出現するすべての文字を文字列 Z に 置き換えることによって構成される文字列を返します。 BINARY 照合シーケンスが比較に使われます。 |
| randomblob(N) | 擬似乱数のバイトを含む N バイトの blob を返します。 N は、正の整数でなくてはなりません。 |
| round(X) round(X,Y) |
ナンバー X の右 Y 桁を丸めます。 Y 引数を省略した場合、0 を想定します。 |
|
rtrim(X) rtrim(X,Y) |
Y に出現するすべての文字を X の左側から削除することによって構成される 文字列を返します。 Y 引数を省略すると、空白文字が取り除かれます。 |
| soundex(X) | 文字列 X の soundex コードを計算します。 引数が NULL の場合、文字列 "?000" を返します。 この関数はデフォルトでは、SQLite から省かれています。 SQLite を構築するときに -DSQLITE_SOUNDEX=1 コンパイラオプションを使うと、利用可能に なります。 |
| sqlite_version(*) | 実行中の SQLite ライブラリのバージョン文字列(たとえば、"2.8.0")を返します。 |
| substr(X,Y,Z) | Y 番目の文字から始まる Z 文字分の長さの入力文字列 X の サブストリングを返します。 X の一番左側の文字の番号は 1 です。 Y が負の場合、左ではなく右側から数えてサブストリングの最初の文字を見つけます。 X が文字列の場合、文字インデックスは実際の UTF-8 文字を参照します。 X が BLOB の場合、インデックスはバイトを参照します。 |
|
trim(X) trim(X,Y) |
Y に出現するすべての文字を X の両端から削除することで構成される文字列を 返します。 Y 引数を省略すると、空白文字が削除されます。 |
| typeof(X) | 式 X の型を返します。 戻り値は、"null"、"integer"、"real"、"text"、"blob" のみです。 SQLite における型の取り扱いは、 Datatypes in SQLite Version 3 で説明します。 |
| upper(X) | Return a copy of input string converted to all upper-case letters. 入力文字列 X をすべて大文字に変換したコピーを返します。 この関数の実装は C ライブラリのルーチン toupper() を使うため、 UTF-8 文字列を正しく取り扱わないかもしれません。 |
| zeroblob(N) | N バイトの 0x00 から構成される BLOB を返します。 SQLite は、非常に効率的のこれらの zeroblob を取り扱います。 zeroblob は、逐次的 BLOB I/O を使って あとで書き込まれる BLOB 用に領域を確保するために使います。 |
日付と時刻関数は、 SQLite Wiki で文書化されています。
集約関数以下に示す集約関数がデフォルトで利用できます。 C 言語で書かれた追加の集約関数を sqlite3_create_function() API を使って追加できます。
一つの引数を取るどのような集約関数も、その引数をキーワード DISTINCT で事前検査できます。 この場合、集約関数に渡される前に重複要素がフィルターされます。 たとえば、関数 "count(distinct X)" は、カラム X の非 NULL 値の合計ではなく カラム X の重複しない値の数を返すでしょう。
| avg(X) | グループ内のすべての NULL でない X の平均値を返します。 数に見えない文字列と BLOB の値は 0 と解釈されます。 avg() の戻り値は、すべての入力が整数値であったとしても、常に浮動小数点値です。 |
| count(X) count(*) |
最初の形式は、グループ内の X が NULL でなかった数を返します。 二番目の形式(引数なし)は、グループ内の行数を返します。 |
| max(X) | グループ内のすべての値の最大値を返します。 通常のソートオーダーが最大値の決定に使われます。 |
| min(X) | グループ内のすべての値で NULL 以外の最小値を返します。 通常のソートオーダーが最小値の決定に使われます。 グループ内のすべての値が NULL である場合に限り、NULL が返されます。 |
| sum(X) total(X) |
グループ内のすべての NULL 以外の値を合計して返します。 NULL 以外の入力行がない場合、 sum() は NULL を返し、total() は 0.0 を返します。 NULL は、行の合計に対して一般的に役立つ戻り値ではありませんが、SQL 規格はこれを要求し、 たいていの他のSQL データベースエンジンもそのように sum() を実装しています。 そこで SQLite は、互換性のために同じよう実装しました。 非標準の total() 関数は、この SQL 言語の仕様上の問題に対する回避策として提供されます。 total() の戻り値は常に浮動小数点値です。 すべての NULL 以外の入力が整数である場合、sum() の戻り値は整数値です。 sum() の入力のどれかが整数でも NULL でもない場合、sum() は実際の合計を近似した 浮動小数点値を返します。 すべての入力が整数または NULL であり計算中に整数オーバーフローが発生した場合、 sum() は "integer overflow" 例外を送出します。 Total() は、決して例外を送出しません。 |