比較関数と演算子

比較演算子

演算子

説明

<

より小さい

>

より大きい

<=

以下

>=

以上

=

等しい

<>

等しくない

!=

等しくない(非標準だが一般的な構文)

範囲演算子: 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

BETWEENNOT BETWEEN 演算子は、文字列引数の評価にも使用できます。

SELECT 'Paul' BETWEEN 'John' AND 'Ringo'; -- true

注意:BETWEENNOT BETWEEN の value、min、max パラメータは、同じ型である必要があります。たとえば、Presto は John が 2.3 と 35.2 の間にあるかどうかを尋ねるとエラーを生成します。

IS NULL と IS NOT NULL

IS NULLIS NOT NULL 演算子は、値が NULL(未定義)かどうかをテストします。両方の演算子は、すべてのデータ型で機能します。

NULLIS 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 FROMIS 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 FROMIS NOT DISTINCT FROM での NULL の処理を示す真理値表を次に示します。

a

b

a = b

a <> b

a DISTINCT b

a NOT DISTINCT b

1

1

TRUE

FALSE

FALSE

TRUE

1

2

FALSE

TRUE

TRUE

FALSE

1

NULL

NULL

NULL

TRUE

FALSE

NULL

NULL

NULL

NULL

FALSE

TRUE

GREATEST と LEAST

これらの関数はSQL標準には含まれていませんが、一般的な拡張機能です。Prestoの他のほとんどの関数と同様に、引数のいずれかがNULLの場合、NULLを返します。PostgreSQLなどの他のデータベースでは、すべての引数がNULLの場合にのみNULLを返すことに注意してください。

サポートされている型は次のとおりです。DOUBLEBIGINTVARCHARTIMESTAMPTIMESTAMP WITH TIME ZONEDATE

greatest(value1, value2, ..., valueN) -> [入力と同じ]()

指定された値の中で最大の値を返します。

least(value1, value2, ..., valueN) -> [入力と同じ]()

指定された値の中で最小の値を返します。

限定比較述語: ALL、ANY、SOME

ALLANYSOME 限定子は、次のように比較演算子と組み合わせて使用できます。

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 = ALL (...)

すべての値と A が等しい場合、true と評価されます。

A <> ALL (...)

どの値とも A が一致しない場合、true と評価されます。

A < ALL (...)

A が最小の値より小さい場合、true と評価されます。

A = ANY (...)

A が値のいずれかと等しい場合、true と評価されます。この形式は A IN (...) と同等です。

A <> ANY (...)

Aが1つ以上の値と一致しない場合、trueと評価されます。

A < ANY (...)

Aが最大値より小さい場合、trueと評価されます。

ANYSOMEは同じ意味を持ち、互換的に使用できます。

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));