<!--

    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at
    
        http://www.apache.org/licenses/LICENSE-2.0
    
    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.

-->

## 查询过滤条件

`WHERE` 子句指定了对数据行的筛选条件，由一个 `whereCondition` 组成。

`whereCondition` 是一个逻辑表达式，对于要选择的每一行，其计算结果为真。如果没有 `WHERE` 子句，将选择所有行。
在 `whereCondition` 中，可以使用除聚合函数之外的任何 IOTDB 支持的函数和运算符。

根据过滤条件的不同，可以分为时间过滤条件和值过滤条件。时间过滤条件和值过滤条件可以混合使用。

### 时间过滤条件

使用时间过滤条件可以筛选特定时间范围的数据。对于时间戳支持的格式，请参考 [时间戳类型](../Data-Concept/Data-Type.md) 。

示例如下：

1. 选择时间戳大于 2022-01-01T00:05:00.000 的数据：

   ```sql
   select s1 from root.sg1.d1 where time > 2022-01-01T00:05:00.000;
   ```

2. 选择时间戳等于 2022-01-01T00:05:00.000 的数据：

   ```sql
   select s1 from root.sg1.d1 where time = 2022-01-01T00:05:00.000;
   ```

3. 选择时间区间 [2017-11-01T00:05:00.000, 2017-11-01T00:12:00.000) 内的数据：

   ```sql
   select s1 from root.sg1.d1 where time >= 2022-01-01T00:05:00.000 and time < 2017-11-01T00:12:00.000;
   ```

注：在上述示例中，`time` 也可写做 `timestamp`。

### 值过滤条件

使用值过滤条件可以筛选数据值满足特定条件的数据。
**允许**使用 select 子句中未选择的时间序列作为值过滤条件。

示例如下：

1. 选择值大于 36.5 的数据：

   ```sql
   select temperature from root.sg1.d1 where temperature > 36.5;
   ```

2. 选择值等于 true 的数据：

   ```sql
   select status from root.sg1.d1 where status = true;

3. 选择区间 [36.5,40] 内或之外的数据：

    ```sql
    select temperature from root.sg1.d1 where temperature between 36.5 and 40;
    ````
    ```sql
    select temperature from root.sg1.d1 where temperature not between 36.5 and 40;
    ````
   
4. 选择值在特定范围内的数据：

   ```sql
   select code from root.sg1.d1 where code in ('200', '300', '400', '500');
   ```

5. 选择值在特定范围外的数据：

   ```sql
   select code from root.sg1.d1 where code not in ('200', '300', '400', '500');
   ```

6. 选择值为空的数据:

    ```sql
    select code from root.sg1.d1 where temperature is null;
    ````

7. 选择值为非空的数据:

    ```sql
    select code from root.sg1.d1 where temperature is not null;
    ````

### 模糊查询

对于 TEXT 类型的数据，支持使用 `Like` 和 `Regexp` 运算符对数据进行模糊匹配

#### 使用 `Like` 进行模糊匹配 

**匹配规则：**

- `%` 表示任意0个或多个字符。
- `_` 表示任意单个字符。

**示例 1：** 查询 `root.sg.d1` 下 `value` 含有`'cc'`的数据。

```
IoTDB> select * from root.sg.d1 where value like '%cc%'
+-----------------------------+----------------+
|                         Time|root.sg.d1.value|
+-----------------------------+----------------+
|2017-11-01T00:00:00.000+08:00|        aabbccdd| 
|2017-11-01T00:00:01.000+08:00|              cc|
+-----------------------------+----------------+
Total line number = 2
It costs 0.002s
```

**示例 2：** 查询 `root.sg.d1` 下 `value` 中间为 `'b'`、前后为任意单个字符的数据。

```
IoTDB> select * from root.sg.device where value like '_b_'
+-----------------------------+----------------+
|                         Time|root.sg.d1.value|
+-----------------------------+----------------+
|2017-11-01T00:00:02.000+08:00|             abc| 
+-----------------------------+----------------+
Total line number = 1
It costs 0.002s
```

#### 使用 `Regexp` 进行模糊匹配 

需要传入的过滤条件为 **Java 标准库风格的正则表达式**。

**常见的正则匹配举例：**

```
长度为3-20的所有字符：^.{3,20}$
大写英文字符：^[A-Z]+$
数字和英文字符：^[A-Za-z0-9]+$
以a开头的：^a.*
```

**示例 1：** 查询 root.sg.d1 下 value 值为26个英文字符组成的字符串。

```shell
IoTDB> select * from root.sg.d1 where value regexp '^[A-Za-z]+$'
+-----------------------------+----------------+
|                         Time|root.sg.d1.value|
+-----------------------------+----------------+
|2017-11-01T00:00:00.000+08:00|        aabbccdd| 
|2017-11-01T00:00:01.000+08:00|              cc|
+-----------------------------+----------------+
Total line number = 2
It costs 0.002s
```

**示例 2：** 查询 root.sg.d1 下 value 值为26个小写英文字符组成的字符串且时间大于100的。

```shell
IoTDB> select * from root.sg.d1 where value regexp '^[a-z]+$' and time > 100
+-----------------------------+----------------+
|                         Time|root.sg.d1.value|
+-----------------------------+----------------+
|2017-11-01T00:00:00.000+08:00|        aabbccdd| 
|2017-11-01T00:00:01.000+08:00|              cc|
+-----------------------------+----------------+
Total line number = 2
It costs 0.002s
```
