比較函數與運算子

比較運算子

運算子

描述

<

小於

>

大於

<=

小於或等於

>=

大於或等於

=

等於

<>

不等於

!=

不等於(非標準但常用的語法)

範圍運算子: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;

BETWEENNOT 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 參數必須是相同的類型。例如,如果您詢問 John 是否在 2.3 和 35.2 之間,Presto 會產生錯誤。

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 的比較都會產生 NULLIS 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 的值時,請使用這些運算子來保證結果為 TRUEFALSE

以下真值表示範 IS DISTINCT FROMIS NOT DISTINCT FROMNULL 的處理方式

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 與一個或多個值不匹配時,評估結果為 true

A < ANY (...)

A 小於最大值時,評估結果為 true

ANYSOME 具有相同的含義,可以互換使用。

LIKE

LIKE 運算子用於匹配字串中指定的字元模式。模式可以包含常規字元以及萬用字元。萬用字元可以使用為 ESCAPE 參數指定的單個字元進行跳脫。匹配區分大小寫,並且模式必須匹配整個字串。

語法

expression LIKE pattern [ ESCAPE ‘escape_character’ ]

如果 patternescape_character 為 null,則表達式評估為 null。

萬用字元

表示

%

百分號表示零個、一個或多個字元

_

底線表示單個字元

範例

 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 子句中指定的多個值提取記錄。括號中必須指定子查詢或值列表,但子查詢中必須指定一列。

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

當使用子查詢來決定比較中使用的值時,子查詢必須傳回單一欄和一或多列。

範例

SELECT id, name FROM region WHERE name IN (SELECT name FROM region WHERE id IN (3,4));