ANY演算子
式 比較演算子 ANY (サブクエリ)
次のSQL文を実行してみてください。
SELECT * FROM Customers WHERE CustomerID = ANY ( SELECT Distinct(CustomerID)FROM Orders );
結果は、例7と同じです。ANYは、「値リストとして指定された値のいずれかの値」を指定します。例えば、「CustomerID = ANY('ALFKI', 'ANATR', 'ANTON') 」とすれば、CustomerIDが「ALFKI」「ANATR」「ANTON」の3つの値のうちいずれかと合致すれば、その行が結果リストとして返されることになります(実際には、ANYの後ろの" ( ) "の中には、サブクエリーのみ指定できます)。
では、INと何が違うか、というと、ANYの前に比較演算子が指定されている点です。例8では「=」を使用しましたが、ANYはほかのすべての比較演算子と組み合わせて使うことができます。
SELECT * FROM Products WHERE UnitPrice > ANY ( SELECT UnitPrice FROM "Order Details" );
例9では、Order Detailsに保存されている単価(UnitPrice)のいずれかよりも高い単価を持つProductをリストアップします(あまり現実的な例ではありません)。
このように、ANYはさまざまな使い方ができますが、今回の例に示すように、ほかのSQL文で置き換え可能なため、実際にはあまり使われません。なお、SOMEは、SQL92ではANYと同義です。
COALESCE(list)
list中の、最初の非NULL要素を返します。
SELECT COALESCE(NULL,1); -> 1 SELECT COALESCE(NULL,NULL,NULL); -> NULL
INTERVAL(N, N1, N2, N3, ...)
もし N < N1 なら 0 を返します。もし N < N2 なら1を返します。全ての引数は整数として扱われる。これは N1 < N2 < N3 < ... < Nnを正しく動作させるために必要なことだ。これはバイナリ検索が使用される(速い)。
SELECT INTERVAL(23, 1, 15, 17, 30, 44, 200); -> 3 SELECT INTERVAL(10, 1, 10, 100, 1000); -> 2 SELECT INTERVAL(22, 23, 30, 44, 200); -> 0
文字列比較関数
通常、比較される表現がケース依存でない場合、比較はケース非依存で行われる。
expr LIKE pat [ESCAPE 'escape-char']
SQLの簡単な正規表現比較。1 (TRUE) または 0 (FALSE) を返します。LIKEには2つのワイルドカードがある。
%
任意の数の文字(0文字も含む)に適合する。
_
厳密に1つの文字に適合する。
SELECT 'David!' LIKE 'David_'; -> 1 SELECT 'David!' LIKE '%D%v%'; -> 1
ワイルドカード文字のテストをするためには、エスケープ文字より先行しておこなおう。ESCAPEを指定しない場合は、文字 '\' が使われる: \% 1つの % に適合する。 \_ 1つの _ に適合する。
SELECT 'David!' LIKE 'David\_'; -> 0 SELECT 'David_' LIKE 'David\_'; -> 1
違うエスケープ文字を指定するには、 ESCAPE節を使用します。
SELECT 'David_' LIKE 'David|_' ESCAPE '|'; -> 1
LIKEは数値表現でも許される。注意: MySQLは文字列中にCのエスケープ文字を使用しているので(e.g., '\n'), LIKEの指定文字列として使用するには \を二倍しなくてはならない。例えば、 '\n' を探すには、'\\n' と記述する。'\' を探すには、'\\\\'(バックスラッシュは、一つはパーサーに取り除かれ、パターンマッチが行われる際にもうひとつ取り除かれ、一致を探すために残った一つのバックスラッシュが使用される)
expr NOT LIKE pat [ESCAPE 'escape-char']
NOT (expr LIKE pat [ESCAPE 'escape-char']) と同じ
SELECT 10 LIKE '1%'; -> 1
expr REGEXP pat
パターンpatに対し、文字式exprのパターンマッチを行います。パターンpatは正規表現の拡張が使用できます。もしexprがpatにマッチするなら 1 を返し、でなければ 0 を返します。
SELECT 'Monty!' REGEXP 'm%y%%'; -> 0 SELECT 'Monty!' REGEXP '.*'; -> 1 SELECT 'new*\n*line' REGEXP 'new\\*.\\*line'; -> 1 SELECT "a" REGEXP "A", "a" REGEXP BINARY "A"; -> 1 0
REGEXPは、文字の型を決定する場合、カレントのキャラクターセットを使用する。(ISO-8859-1
Latin1 がデフォルト)
expr NOT REGEXP pat
NOT (expr REGEXP pat) と同じ。
STRCMP(expr1, expr2)
文字列が同じなら 0 を返します。そうでなければ、最初の引数がソート順で小さければ -1を返します。そうでなければ 1 を返します。
SELECT STRCMP('text', 'text2'); -> -1 SELECT STRCMP('text2', 'text'); -> 1 SELECT STRCMP('text', 'text'); -> 0
MATCH (col1,col2,...) AGAINST (expr)
MATCH ... AGAINST() は全文検索に使用され、妥当性を返します。フィールド
(col1,col2,...) 内のテキストとクエリexprとの間の類似点を評価します。妥当性は正の浮動小数点数です。妥当性 0 は類似点なしを意味します。MATCH... AGAINST() が動作するためには、最初に FULLTEXTインデックスが作成する必要があります。
ワイルドカードを含む文字列の検索
ワイルドカードを含む文字列を検索するには、[ESCAPE]オプションを使うか、文字 '\'
を使用します。
SELECT 'David!' LIKE 'David\_'; -> 0 SELECT 'David_' LIKE 'David\_'; -> 1
違うエスケープ文字を指定するには、ESCAPE節を使用します。
SELECT 'David_' LIKE 'David|_' ESCAPE '|'; -> 1
LIKEは数値表現でも許される(MySQL拡張)。
キャスト
BINARY
BINARY演算子は、これ以降に続く文字をバイナリにキャストします。これはたとえフィールドがBINARYやBLOB定義でなくても、ケース依存でフィールドを比較することが出来る簡単な方法です。
SELECT "a" = "A"; -> 1 SELECT BINARY "a" = "A"; -> 0