比較函數與運算子¶
比較運算子¶
運算子 |
描述 |
---|---|
|
小於 |
|
大於 |
|
小於或等於 |
|
大於或等於 |
|
等於 |
|
不等於 |
|
不等於(非標準但常用的語法) |
範圍運算子: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 參數必須是相同的類型。例如,如果您詢問 John 是否在 2.3 和 35.2 之間,Presto 會產生錯誤。
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
以下是一些量詞和比較運算子組合的含義:
表達式 |
含義 |
---|---|
|
當 |
|
當 |
|
當 |
|
當 |
|
當 |
|
當 |
ANY
和 SOME
具有相同的含義,可以互換使用。
LIKE¶
LIKE 運算子用於匹配字串中指定的字元模式。模式可以包含常規字元以及萬用字元。萬用字元可以使用為 ESCAPE 參數指定的單個字元進行跳脫。匹配區分大小寫,並且模式必須匹配整個字串。
語法
expression LIKE pattern [ ESCAPE ‘escape_character’ ]
如果 pattern
或 escape_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));