比較関数と演算子¶
比較演算子¶
演算子 |
説明 |
---|---|
|
より小さい |
|
より大きい |
|
以下 |
|
以上 |
|
等しい |
|
等しくない |
|
等しくない(非標準だが一般的な構文) |
範囲演算子: BETWEEN¶
BETWEEN
演算子は、値が指定された範囲内にあるかどうかをテストします。value BETWEEN min AND max
という構文を使用します。
SELECT 3 BETWEEN 2 AND 6;
上記のステートメントは、次のステートメントと同等です。
SELECT 3 >= 2 AND 3 <= 6;
値が指定された範囲に含まれないかどうかをテストするには、NOT BETWEEN
を使用します。
SELECT 3 NOT BETWEEN 2 AND 6;
上記のステートメントは、次のステートメントと同等です。
SELECT 3 < 2 OR 3 > 6;
BETWEEN
または NOT BETWEEN
ステートメントに NULL が存在すると、ステートメントは NULL と評価されます。
SELECT NULL BETWEEN 2 AND 4; -- null
SELECT 2 BETWEEN NULL AND 6; -- null
BETWEEN
と NOT BETWEEN
演算子は、文字列引数の評価にも使用できます。
SELECT 'Paul' BETWEEN 'John' AND 'Ringo'; -- true
注意:BETWEEN
と NOT BETWEEN
の value、min、max パラメータは、同じ型である必要があります。たとえば、Presto は John が 2.3 と 35.2 の間にあるかどうかを尋ねるとエラーを生成します。
IS NULL と IS NOT NULL¶
IS NULL
と IS NOT NULL
演算子は、値が NULL(未定義)かどうかをテストします。両方の演算子は、すべてのデータ型で機能します。
NULL
を IS NULL
と共に使用すると、true と評価されます。
select NULL IS NULL; -- true
しかし、他の定数ではそうではありません。
SELECT 3.0 IS NULL; -- false
IS DISTINCT FROM と IS NOT DISTINCT FROM¶
SQL では、NULL
値は不明な値を表すため、NULL
を含む比較はすべて NULL
を生成します。IS DISTINCT FROM
と IS NOT DISTINCT FROM
演算子は、NULL
を既知の値として扱い、両方の演算子は、NULL
入力が存在する場合でも、true または false の結果を保証します。
SELECT NULL IS DISTINCT FROM NULL; -- false
SELECT NULL IS NOT DISTINCT FROM NULL; -- true
上記の例では、NULL
値は NULL
とは異なるものとは見なされません。NULL
を含む可能性のある値を比較する場合は、これらの演算子を使用して、TRUE
または FALSE
の結果を保証します。
IS DISTINCT FROM
と IS NOT DISTINCT FROM
での NULL
の処理を示す真理値表を次に示します。
a |
b |
a = b |
a <> b |
a DISTINCT b |
a NOT DISTINCT b |
---|---|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
GREATEST と LEAST¶
これらの関数はSQL標準には含まれていませんが、一般的な拡張機能です。Prestoの他のほとんどの関数と同様に、引数のいずれかがNULLの場合、NULLを返します。PostgreSQLなどの他のデータベースでは、すべての引数がNULLの場合にのみNULLを返すことに注意してください。
サポートされている型は次のとおりです。DOUBLE
、BIGINT
、VARCHAR
、TIMESTAMP
、TIMESTAMP WITH TIME ZONE
、DATE
- greatest(value1, value2, ..., valueN) -> [入力と同じ]()¶
指定された値の中で最大の値を返します。
- least(value1, value2, ..., valueN) -> [入力と同じ]()¶
指定された値の中で最小の値を返します。
限定比較述語: ALL、ANY、SOME¶
ALL
、ANY
、SOME
限定子は、次のように比較演算子と組み合わせて使用できます。
expression operator quantifier ( subquery )
例えば
SELECT 'hello' = ANY (VALUES 'hello', 'world'); -- true
SELECT 21 < ALL (VALUES 19, 20, 21); -- false
SELECT 42 >= SOME (SELECT 41 UNION ALL SELECT 42 UNION ALL SELECT 43); -- true
いくつかの限定子と比較演算子の組み合わせの意味を次に示します。
式 |
意味 |
---|---|
|
すべての値と |
|
どの値とも |
|
A が最小の値より小さい場合、 |
|
A が値のいずれかと等しい場合、 |
|
|
|
|
ANY
とSOME
は同じ意味を持ち、互換的に使用できます。
LIKE¶
LIKE演算子は、文字列内で指定された文字パターンと一致させるために使用されます。パターンには、通常の文字とワイルドカードを含めることができます。ワイルドカード文字は、ESCAPEパラメータで指定された単一の文字を使用してエスケープできます。照合は大文字と小文字を区別し、パターンは文字列全体と一致する必要があります。
構文
expression LIKE pattern [ ESCAPE ‘escape_character’ ]
pattern
またはescape_character
がNULLの場合、式はNULLと評価されます。
ワイルドカード |
表現 |
---|---|
|
パーセント記号 (%) は、0個、1個、または複数の文字を表します。 |
|
アンダースコア (_) は、1つの文字を表します。 |
例
SELECT * FROM (VALUES ('abc'), ('bcd'), ('cde')) AS t (name)
WHERE name LIKE '%b%'
--returns 'abc' and 'bcd'
SELECT * FROM (VALUES ('abc'), ('bcd'), ('cde')) AS t (name)
WHERE name LIKE '_b%'
--returns 'abc'
SELECT * FROM (VALUES ('abc'), ('bcd'), ('cde')) AS t (name)
WHERE name LIKE 'b%'
--returns 'bcd'
SELECT * FROM (VALUES ('abc'), ('bcd'), ('cde')) AS t (name)
WHERE name LIKE 'B%'
--returns nothing
SELECT * FROM (VALUES ('a_c'), ('_cd'), ('cde')) AS t (name)
WHERE name LIKE '%#_%' ESCAPE '#'
--returns 'a_c' and '_cd'
SELECT * FROM (VALUES ('a%c'), ('%cd'), ('cde')) AS t (name)
WHERE name LIKE '%#%%' ESCAPE '#'
--returns 'a%c' and '%cd'
SELECT 'ab' || chr(10) || 'c' LIKE 'ab' --chr(10) is a newline character
--returns 'false'
行比較: IN¶
SQLのIN比較演算子は、値を指定されたリテラル値のリストと比較するために使用されます。IN演算子は、値がリスト内のリテラル値のいずれかと一致する場合、TRUEを返します。IN演算子は、以下のパターンを持つ値を比較するために使用できます。WHERE句で指定された複数の値に従ってレコードを取得できます。サブクエリまたは値のリストを括弧内に指定する必要がありますが、サブクエリでは1つの列を指定する必要があります。
WHERE column [NOT] IN ('value1','value2');
WHERE column [NOT] IN ( subquery )
例
SELECT * FROM region WHERE name IN ('AMERICA', 'EUROPE');
SELECT * FROM region WHERE name IN ('NULL', 'AMERICA', 'EUROPE');
SELECT * FROM table_name WHERE (column1, column2) IN ((NULL, 'value1'), ('value2', 'value3'));
行比較: OR¶
OR演算子は、複数の条件に基づいてクエリの結果をフィルタリングするために使用されます。ORで区切られた条件のいずれかがTRUEの場合、レコードを返します。句内の値は、論理ORとして結合された複数の比較に使用されます。前のクエリは、次のクエリと同等です。
例
SELECT * FROM region WHERE name = 'AMERICA' OR name = 'EUROPE';
行比較: NOT IN¶
SQLのNOT IN比較演算子は、リストまたはサブクエリ内の任意の値と一致する行を除外するために使用されます。
NOTを追加することで比較を否定し、リスト内の値を除くすべての領域を取得できます。
例
SELECT * FROM region WHERE name NOT IN ('AMERICA', 'EUROPE');
サブクエリを使用して比較に使用する値を決定する場合、サブクエリは単一の列と1つ以上の行を返す必要があります。
例
SELECT id, name FROM region WHERE name IN (SELECT name FROM region WHERE id IN (3,4));