比較運算符用于判斷參數的大小關系,適用于任意可比較的數據類型(double、bigint、varchar、timestamp和date)。本文介紹比較運算符的基本語法以及示例。
日志服務支持如下比較運算符。
運算符 | 語法 | 說明 | 支持SQL | 支持SPL |
x < y | x小于y時,返回true。 | √ | √ | |
x > y | x大于y時,返回true。 | √ | √ | |
x <= y | x小于或等于y時,返回true。 | √ | √ | |
x >= y | x大于或等于y時,返回true。 | √ | √ | |
x = y | x等于y時,返回true。 | √ | √ | |
x <> y | x不等于y時,返回true。 | √ | √ | |
x != y | x不等于y時,返回true。 | √ | √ | |
x relational operator ALL(subquery) | x滿足所有條件時,返回true。 | √ | × | |
x relational operator ANY(subquery) | x滿足任意一個條件時,返回true。 | √ | × | |
x BETWEEN y AND z | x處在y和z之間時,返回true。 | √ | √ | |
x IS DISTINCT FROM y | x不等于y時,返回true。 | √ | × | |
x IS NOT DISTINCT FROM y | x等于y時,返回true。 | √ | × | |
x LIKE pattern [escape 'escape_character'] | 用于匹配字符串中指定的字符模式。字符串區分大小寫。 | √ | √ | |
x relational operator SOME(subquery) | x滿足任意一個條件時,返回true。 | √ | × | |
GREATEST(x, y...) | 查詢x、y中的最大值。 | √ | × | |
LEAST(x, y...) | 查詢x、y中的最小值。 | √ | × | |
x IS NULL | x為null時,返回true。 | √ | √ | |
x IS NOT NULL | x不為null時,返回true。 | √ | √ |
基礎運算符
基礎運算符用于比較x和y的大小關系。如果邏輯成立,則返回true。
語法
語法 | 說明 |
x < y | x小于y |
x > y | x大于y |
x <= y | x小于或等于y |
x >= y | x大于或等于y |
x = y | x等于y |
x <> y | x不等于y |
x != y | x不等于y |
參數說明
參數 | 說明 |
x | 參數值為任意可比較的數據類型。 |
y | 參數值為任意可比較的數據類型。 |
返回值類型
boolean類型。
示例
示例1:查詢昨天的日志。
查詢和分析語句
* | SELECT * FROM log WHERE __time__ < to_unixtime(current_date) AND __time__ > to_unixtime(date_add('day', -1, current_date))
查詢和分析結果
示例2:電商公司A通過訪問日志中的mobile字段和client_ip字段,分析哪些客戶的電話號碼所在地和其訪問電商網站的IP地址所在地不同。
字段樣例
mobile:1881111**** client_ip:192.168.2.0
查詢和分析語句
* | SELECT mobile, client_ip, count(*) AS PV WHERE mobile_city(mobile) != ip_to_city(client_ip) AND ip_to_city(client_ip) != '' GROUP BY client_ip, mobile ORDER BY PV DESC
查詢和分析結果
ALL運算符
ALL運算符用于判斷x是否滿足所有條件。如果滿足,則返回true。
語法
x relational operator ALL(subquery)
參數說明
參數 | 說明 |
x | 參數值為任意可比較的數據類型。 |
比較運算符 | <、>、<=、>=、=、<>、!= 重要 ALL運算符必須緊跟在基礎運算符(<、>、<=、>=、=、<>、!=)后面。 |
subquery | SQL子查詢。 |
返回值類型
boolean類型。
示例
實例i-01相關的所有請求的狀態碼是否都為200。
字段樣例
instance_id:i-01 status:200
查詢和分析語句
* | select 200 = ALL(select status where instance_id='i-01')
查詢和分析結果
ANY運算符
ANY運算符用于判斷x是否滿足任意一個條件。如果滿足,則返回true。
語法
x relational operator ANY(subquery)
參數說明
參數 | 說明 |
x | 參數值為任意可比較的數據類型。 |
比較運算符 | <、>、<=、>=、=、<>、!= 重要 ANY運算符必須緊跟在比較運算符(<、>、<=、>=、=、<>、!=)后面。 |
subquery | SQL子查詢。 |
返回值類型
boolean類型。
示例
實例i-01相關的請求中,是否存在請求狀態碼為200的請求。
字段樣例
instance_id:i-01 status:200
查詢和分析語句
* | SELECT 200 = ANY(SELECT status WHERE instance_id='i-01')
查詢和分析結果
BETWEEN運算符
BETWEEN用于判斷x是否處在y和z之間。如果是,則返回true。y和z之間的范圍為閉區間。
語法
x BETWEEN y AND z
參數說明
參數 | 說明 |
x | 參數值為任意可比較的數據類型。 |
y | 參數值為任意可比較的數據類型。 |
z | 參數值為任意可比較的數據類型。 |
x、y和z的數據類型必須一致。
x、y和z中任意一個的值包含null,則返回結果為null。
返回值類型
boolean類型。
示例
示例1:判斷status字段值是否在[200,299]范圍內。
查詢和分析語句
* | SELECT status BETWEEN 200 AND 299
查詢和分析結果
示例2:計算status字段值不在[200,299]范圍內的日志條數。
查詢和分析語句
* | SELECT count(*) AS count FROM log WHERE status NOT BETWEEN 200 AND 299
查詢和分析結果
DISTINCT運算符
DISTINCT運算符用于判斷x和y是否相同。
語法
IS DISTINCT FROM表示x不等于y時,返回true。
x IS DISTINCT FROM y
IS NOT DISTINCT FROM表示x等于y時,返回true。
x IS NOT DISTINCT FROM y
參數說明
參數 | 說明 |
x | 參數值為任意可比較的數據類型。 |
y | 參數值為任意可比較的數據類型。 |
與基礎運算符(=、<>)對比,區別在于DISTINCT運算符可用于null的對比。
x | y | x = y | x <> y | x IS DISTINCT FROM y | x IS NOT DISTINCT FROM y |
1 | 1 | true | false | false | true |
1 | 2 | false | true | true | false |
1 | null | null | null | true | false |
null | null | null | null | false | true |
返回值類型
boolean類型。
示例
將0和null進行對比。
查詢和分析語句
* | select 0 IS DISTINCT FROM null
查詢和分析結果
LIKE運算符
LIKE運算符用于匹配字符串中指定的字符模式。字符串區分大小寫。
語法
x LIKE pattern [escape 'escape_character']
參數說明
參數 | 說明 |
x | 參數值為任意可比較的數據類型。 |
pattern | 字符模式,包括字符串和通配符。通配符說明如下:
|
escape_character | 對字符模式中的通配符進行轉義的字符表達式。 |
LIKE運算符主要用于日志的精準查詢。更多信息,請參見如何精準查詢日志。
返回值類型
boolean類型。
示例
SQL
示例1:查詢request_uri字段值是以file-8或file-6結尾的日志。
字段樣例
request_uri:/request/path-2/file-6
查詢和分析語句
*|SELECT * WHERE request_uri LIKE '%file-8' OR request_uri LIKE '%file-6'
查詢和分析結果
示例2:判斷request_uri字段值是否以file-6結尾。
字段樣例
request_uri:/request/path-2/file-6
查詢和分析語句
* | SELECT request_uri LIKE '%file-6'
查詢和分析結果
SPL
示例1:查詢request_uri字段值是以file-8或file-6結尾的日志。
字段樣例
request_uri:/request/path-2/file-6
SPL語句
*|WHERE request_uri LIKE '%file-8' OR request_uri LIKE '%file-6'
SPL結果
示例2:判斷request_uri字段值是否以file-6結尾。
字段樣例
request_uri:/request/path-2/file-6
SPL語句
* | extend a = request_uri LIKE '%file-6'
SPL結果
SOME運算符
SOME運算符用于判斷x是否滿足任意一個條件。如果滿足,則返回true。
語法
x relational operator SOME(subquery)
參數說明
參數 | 說明 |
x | 參數值為任意可比較的數據類型。 |
比較運算符 | <、>、<=、>=、=、<>、!= 重要 SOME運算符必須緊跟在比較運算符(<、>、<=、>=、=、<>、!=)后面。 |
subquery | SQL子查詢。 |
返回值類型
boolean類型。
示例
實例i-01相關的請求中,是否存在請求時長小于20s的請求。
字段樣例
instance_id:i-01 request_time:16
查詢和分析語句
* | SELECT 20 > SOME(SELECT request_time WHERE instance_id='i-01')
查詢和分析結果
GREATEST運算符
GREATEST運算符用于獲取x、y中的最大值。
GREATEST運算符用于橫向對比,max函數用于縱向對比。
語法
GREATEST(x, y...)
參數說明
參數 | 說明 |
x | 參數值為任意可比較的數據類型。 |
y | 參數值為任意可比較的數據類型。 |
返回值類型
double類型。
示例
對同一行中的request_time字段值和status字段值進行對比,獲取其中的最大值。
字段樣例
request_time:38 status:200
查詢和分析語句
* | SELECT GREATEST(request_time,status)
查詢和分析結果
LEAST運算符
LEAST運算符用于獲取x、y中的最小值。
LEAST運算符用于橫向對比,min函數用于縱向對比。
語法
LEAST(x, y...)
參數說明
參數 | 說明 |
x | 參數值為任意可比較的數據類型。 |
y | 參數值為任意可比較的數據類型。 |
返回值類型
double類型。
示例
對同一行中的request_time字段值和status字段值進行對比,獲取其中的最小值。
字段樣例
request_time:77 status:200
查詢和分析語句
* | SELECT LEAST(request_time,status)
查詢和分析結果
NULL運算符
NULL運算符用于判斷x是否為null。
語法
IS NULL表示參數值為null時,返回true。
x IS NULL
IS NOT NULL表示參數值不為null時,返回true。
x IS NOT NULL
參數說明
參數 | 說明 |
x | 參數值為任意可比較的數據類型。 |
返回值類型
boolean類型。
示例
示例1:判斷status字段值是否為null。
查詢和分析語句
* | select status IS NULL
查詢和分析結果
示例2:統計status字段值不為空的日志條數。
查詢和分析語句
* | SELECT count(*) AS count FROM log WHERE status IS NOT NULL
查詢和分析結果