比較子用於判斷參數的大小關係,適用於任意可比較的資料類型(double、bigint、varchar、timestamp和date)。本文介紹比較子的基本文法以及樣本。
Log Service支援如下比較子。
運算子 | 文法 | 說明 | 支援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
查詢和分析結果