第4章 関数

文字列の比較関数

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

expr RLIKE 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

expr NOT RLIKE 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

関連記事