WHERE子句根據field、tag和/或timestamp來過濾數據。

語法

SELECT_clause FROM_clause WHERE <conditional_expression> [(AND|OR) <conditional_expression> [...]]

語法描述

WHERE子句支持在field、tag和timestamp上的條件表達式(conditional_expression)。

field

field_key <operator> ['string' | boolean | float | integer]

WHERE子句支持對field value進行比較,field value可以是字符串、布爾值、浮點數或者整數。

在WHERE子句中,請對字符串類型的field value用單引號括起來。如果字符串類型的field value沒有使用引號或者使用了雙引號,那么不會返回任何查詢結果,在大多數情況下,也不會返回錯誤。支持的操作符:

操作符 含義
= 等于
<> 不等于
!= 不等于
> 大于
>= 大于或等于
< 小于
<= 小于或等于

除此之外,還支持的功能:算術運算和正則表達式。

tag

tag_key <operator> ['tag_value']

在WHERE子句中,請對tag value用單引號括起來。如果tag value沒有使用引號或者使用了雙引號,那么不會返回任何查詢結果,在大多數情況下,也不會返回錯誤。支持的操作符:

操作符 說明
= 等于
<> 不等于
!= 不等于

除此之外,還支持的功能:正則表達式。

timestamp

對于大多數SELECT語句,默認的時間范圍是從1677-09-21 00:12:43.145224194 UTC到2262-04-11T23:47:16.854775806Z UTC。對于帶GROUP BY time()子句的SELECT語句,默認的時間范圍是從1677-09-21 00:12:43.145224194 UTC到now()。

示例

查詢field value滿足一定條件的數據。
> SELECT * FROM "h2o_feet" WHERE "water_level" > 8
name: h2o_feet
--------------
time                   level description      location       water_level
2015-08-18T00:00:00Z   between 6 and 9 feet   coyote_creek   8.12
2015-08-18T00:06:00Z   between 6 and 9 feet   coyote_creek   8.005
[...]
2015-09-18T00:12:00Z   between 6 and 9 feet   coyote_creek   8.189
2015-09-18T00:18:00Z   between 6 and 9 feet   coyote_creek   8.084

該查詢返回h2o_feet中的數據,這些數據滿足條件:field key water_level的值大于8。

查詢field value滿足一定條件的數據(field value是字符串類型)

> SELECT * FROM "h2o_feet" WHERE "level description" = 'below 3 feet'
name: h2o_feet
--------------
time                   level description   location       water_level
2015-08-18T00:00:00Z   below 3 feet        santa_monica   2.064
2015-08-18T00:06:00Z   below 3 feet        santa_monica   2.116
[...]
2015-09-18T14:06:00Z   below 3 feet        santa_monica   2.999
2015-09-18T14:36:00Z   below 3 feet        santa_monica   2.907

該查詢返回h2o_feet中的數據,這些數據滿足條件:field key level description的值等于字符串below 3 feet。在WHERE子句中,需要用單引號將字符串類型的field value括起來。

查詢field value滿足一定條件的數據(WHERE子句包含基本運算)

> SELECT * FROM "h2o_feet" WHERE "water_level" + 2 > 11.9
name: h2o_feet
--------------
time                   level description           location       water_level
2015-08-29T07:06:00Z   at or greater than 9 feet   coyote_creek   9.902
2015-08-29T07:12:00Z   at or greater than 9 feet   coyote_creek   9.938
2015-08-29T07:18:00Z   at or greater than 9 feet   coyote_creek   9.957
2015-08-29T07:24:00Z   at or greater than 9 feet   coyote_creek   9.964
2015-08-29T07:30:00Z   at or greater than 9 feet   coyote_creek   9.954
2015-08-29T07:36:00Z   at or greater than 9 feet   coyote_creek   9.941
2015-08-29T07:42:00Z   at or greater than 9 feet   coyote_creek   9.925
2015-08-29T07:48:00Z   at or greater than 9 feet   coyote_creek   9.902
2015-09-02T23:30:00Z   at or greater than 9 feet   coyote_creek   9.902

該查詢返回h2o_feet中的數據,這些數據滿足條件:field key water_level的值加上2大于11.9。請注意,TSDB For InfluxDB?遵循標準的算術運算順序??刹榭磾祵W運算符章節了解更多相關信息。

查詢tag value滿足一定條件的數據

> SELECT "water_level" FROM "h2o_feet" WHERE "location" = 'santa_monica'
name: h2o_feet
--------------
time                   water_level
2015-08-18T00:00:00Z   2.064
2015-08-18T00:06:00Z   2.116
[...]
2015-09-18T21:36:00Z   5.066
2015-09-18T21:42:00Z   4.938

該查詢返回h2o_feet中的數據,這些數據滿足條件:tag key location的值是santa_monica。在WHERE子句中,需要用單引號將字符串類型的tag value括起來。

查詢field value和tag value都滿足一定條件的數據

> SELECT "water_level" FROM "h2o_feet" WHERE "location" <> 'santa_monica' AND ("water_level" < -0.59 OR "water_level" > 9.95)
name: h2o_feet
--------------
time                   water_level
2015-08-29T07:18:00Z   9.957
2015-08-29T07:24:00Z   9.964
2015-08-29T07:30:00Z   9.954
2015-08-29T14:30:00Z   -0.61
2015-08-29T14:36:00Z   -0.591
2015-08-30T15:18:00Z   -0.594

該查詢返回h2o_feet中的數據,這些數據滿足條件:tag key location的值不等于santa_monica,并且,field key water_level的值小于-0.59或大于9.95。WHERE子句支持操作符AND和OR,并支持用括號將它們的邏輯分開。

查詢timestamp滿足一定條件的數據

> SELECT * FROM "h2o_feet" WHERE time > now() - 7d

該查詢返回h2o_feet中的數據,這些數據滿足條件:timestamp在過去7天內。本頁面中的時間語法章節將詳細介紹WHERE子句中支持的時間語法。

WHERE子句的常見問題

WHERE子句出現異常則沒有結果返回

在大多數情況下,引起這個問題的原因是tag value或字符串類型的field value缺少單引號。如果tag value或字符串類型的field value沒有使用引號或者使用了雙引號,那么不會返回任何查詢結果,在大多數情況下,也不會返回錯誤。

下面的代碼塊中,前兩個查詢分別嘗試沒有用引號或者嘗試用雙引號來指定tag value:santa_monica,這兩個查詢不會返回任何結果。第三個查詢使用了單引號將santa_monica括起來(這是支持的語法),返回了預期的結果。

> SELECT "water_level" FROM "h2o_feet" WHERE "location" = santa_monica
> SELECT "water_level" FROM "h2o_feet" WHERE "location" = "santa_monica"
> SELECT "water_level" FROM "h2o_feet" WHERE "location" = 'santa_monica'
name: h2o_feet
--------------
time                   water_level
2015-08-18T00:00:00Z   2.064
[...]
2015-09-18T21:42:00Z   4.938

下面的代碼塊中,前兩個查詢分別嘗試沒有用引號或者嘗試用雙引號來指定字符串類型的field value:at or greater than 9 feet。第一個查詢返回錯誤,因為該field value包含空格。第二個查詢沒有返回任何結果。第三個查詢使用了單引號將at or greater than 9 feet括起來(這是支持的語法),返回了預期的結果。

> SELECT "level description" FROM "h2o_feet" WHERE "level description" = at or greater than 9 feet
ERR: error parsing query: found than, expected ; at line 1, char 86
> SELECT "level description" FROM "h2o_feet" WHERE "level description" = "at or greater than 9 feet"
> SELECT "level description" FROM "h2o_feet" WHERE "level description" = 'at or greater than 9 feet'
name: h2o_feet
--------------
time                   level description
2015-08-26T04:00:00Z   at or greater than 9 feet
[...]
2015-09-15T22:42:00Z   at or greater than 9 feet