
# 数学运算函数
#### 关系运算符
所有数据类型都可用关系运算符进行比较，并返回一个BOOLEAN类型的值。
关系运算符均为双目操作符，被比较的两个数据类型必须是相同的数据类型或者是可以进行隐式转换的类型。
Flink SQL提供的关系运算符，请参见[表1]。
 表1关系运算符 
| **运算符**                                          | **返回类型** | **描述**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
|:---|:---|:---|
| A = B                                            | BOOLEAN  | 若A与B相等，返回TRUE，否则返回FALSE。用于做赋值操作。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| A \<\> B                                         | BOOLEAN  | 若A与B不相等，则返回TRUE，否则返回FALSE。若A或B为NULL，则返回NULL，该种运算符为标准SQL语法。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| A \< B                                           | BOOLEAN  | 若A小于B，则返回TRUE，否则返回FALSE。若A或B为NULL，则返回NULL。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| A \<= B                                          | BOOLEAN  | 若A小于或者等于B，则返回TRUE，否则返回FALSE。若A或B为NULL，则返回NULL。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| A \> B                                           | BOOLEAN  | 若A大于B，则返回TRUE，否则返回FALSE。若A或B为NULL，则返回NULL。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| A \>= B                                          | BOOLEAN  | 若A大于或者等于B，则返回TRUE，否则返回FALSE。若A或B为NULL，则返回NULL。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| A IS NULL                                        | BOOLEAN  | 若A为NULL则返回TRUE，否则返回FALSE。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| A IS NOT NULL                                    | BOOLEAN  | 若A不为NULL，则返回TRUE，否则返回FALSE。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| A IS DISTINCT FROM B                             | BOOLEAN  | 若A与B不相等，则返回TRUE，将空值视为相同。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| A IS NOT DISTINCT FROM B                         | BOOLEAN  | 若A与B相等，则返回TRUE，将空值视为相同。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| A BETWEEN \[ASYMMETRIC \| SYMMETRIC\] B AND C    | BOOLEAN  | 若A大于或等于B且小于或等于C，则返回TRUE。 - ASYMMETRIC：表示B和C位置相关。 例如：A BETWEEN ASYMMETRIC B AND C 等价于 (A BETWEEN B AND C)。   - SYMMETRIC：表示B和C位置不相关。 例如：A BETWEEN SYMMETRIC B AND C 等价于 (A BETWEEN B AND C) OR (A BETWEEN C AND B)。    |
| A NOT BETWEEN B \[ASYMMETRIC \| SYMMETRIC\]AND C | BOOLEAN  | 若A小于B或大于C，则返回TRUE。 - ASYMMETRIC：表示B和C位置相关。 例如：A NOT BETWEEN ASYMMETRIC B AND C 等价于 (A NOT BETWEEN B AND C)。   - SYMMETRIC：表示B和C位置不相关。 例如：A NOT BETWEEN SYMMETRIC B AND C 等价于 (A NOT BETWEEN B AND C) OR (A NOT BETWEEN C AND B)。                                                                                                                                                                                       |
| A LIKE B \[ ESCAPE C \]                          | BOOLEAN  | 若A与模式B匹配，则返回TRUE。 必要时可以定义转义字符C。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| A NOT LIKE B \[ ESCAPE C \]                      | BOOLEAN  | 若A与模式B不匹配，则返回TRUE。 必要时可以定义转义字符C。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| A SIMILAR TO B \[ ESCAPE C \]                    | BOOLEAN  | 若A与正则表达式B匹配，则返回TRUE。 必要时可以定义转义字符C。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| A NOT SIMILAR TO B \[ ESCAPE C \]                | BOOLEAN  | 若A与正则表达式B不匹配，则返回TRUE。 必要时可以定义转义字符C。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
| value IN (value \[, value\]\* )                  | BOOLEAN  | 若值等于列表中的值，则返回TRUE。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| value NOT IN (value \[, value\]\* )              | BOOLEAN  | 若值不等于列表中的每个值，则返回TRUE。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| EXISTS (sub-query)                               | BOOLEAN  | 若子查询至少返回一条数据，则返回TRUE。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| value IN (sub-query)                             | BOOLEAN  | 若值等于子查询返回的某个值，则返回TRUE。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| value NOT IN (sub-query)                         | BOOLEAN  | 若值不等于子查询返回的每个值，则返回TRUE。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
   
**注意事项**
- double、real和float值存在一定的精度差。且我们不建议直接使用等号"="对两个double类型数据进行比较。用户可以使用两个double类型相减，而后取绝对值的方式判断。当绝对值足够小时，认为两个double数值相等，例如:
  ```
  abs(0.9999999999 - 1.0000000000) < 0.000000001 //0.9999999999和1.0000000000为10位精度，而0.000000001为9位精度，此时可以认为0.9999999999和1.0000000000相等。
  ```
  

- 数值类型可与字符串类型进行比较。做大小(\>,\<,\>=,\<=)比较时，会默认将字符串转换为数值类型，因此不支持字符串内有除数字字符之外的字符。
- 字符串之间可以进行比较。
 
#### 逻辑运算符
常用的逻辑操作符有AND、OR和NOT，优先级顺序为：NOT\>AND\>OR。
运算规则请参见[表2]，表中的A和B代表逻辑表达式。
 表2逻辑运算符 
| **运算符**          | **返回类型** | **描述**                                |
|:---|:---|:---|
| A OR B           | BOOLEAN  | 若A或B为TRUE，则返回TRUE，且支持三值逻辑。            |
| A AND B          | BOOLEAN  | 若A和B为TRUE，则返回TRUE，且支持三值逻辑。            |
| NOT A            | BOOLEAN  | 若A不为TRUE则返回TRUE；若A为UNKNOWN，返回UNKNOWN。 |
| A IS FALSE       | BOOLEAN  | 若A为FALSE则返回TRUE； 若A为UNKNOWN，则返回FALSE。 |
| A IS NOT FALSE   | BOOLEAN  | 若A不为FALSE则返回TRUE；若A为UNKNOWN，则返回TRUE。  |
| A IS TRUE        | BOOLEAN  | 若A为TRUE，则返回TRUE；若A为UNKNOWN，则返回FALSE。  |
| A IS NOT TRUE    | BOOLEAN  | 若A不为TRUE则返回TRUE；若A为UNKNOWN，则返回TRUE。   |
| A IS UNKNOWN     | BOOLEAN  | 若A为UNKNOWN，则返回TRUE。                   |
| A IS NOT UNKNOWN | BOOLEAN  | 若A不为UNKNOWN，则返回TRUE。                  |
   
**注意事项**
逻辑操作符只允许boolean类型参与运算，不支持隐式类型转换。
#### 算术运算符
算术运算符包括双目运算符与单目运算符，这些运算符都将返回数字类型。Flink SQL所支持的算术运算符如[表3]所示。
 表3算术运算符 
| **运算符**                                                                                    | **返回类型** | **描述**                                                                                                                                                  |
|:---|:---|:---|
| + numeric                                                                                  | 所有数字类型   | 返回数字。                                                                                                                                                   |
| - numeric                                                                                  | 所有数字类型   | 返回负数。                                                                                                                                                   |
| A + B                                                                                      | 所有数字类型   | A和B相加。结果数据类型与操作数据类型相关，例如一个整数类型数据加上一个浮点类型数据，结果数值为浮点类型数据。                                                                                                 |
| A - B                                                                                      | 所有数字类型   | A和B相减。结果数据类型与操作数据类型相关。                                                                                                                                  |
| A \* B                                                                                     | 所有数字类型   | A和B相乘。结果数据类型与操作数据类型相关。                                                                                                                                  |
| A / B                                                                                      | 所有数字类型   | A和B相除。结果是一个double（双精度）类型的数值。                                                                                                                            |
| POWER(A, B)                                                                                | 所有数字类型   | 返回A数的B次方乘幂。                                                                                                                                             |
| ABS(numeric)                                                                               | 所有数字类型   | 返回数值的绝对值。                                                                                                                                               |
| MOD(A, B)                                                                                  | 所有数字类型   | 返回A除以B的余数（模数）。 返回值只有在A为负数时才为负数。                                                                                                                         |
| SQRT(A)                                                                                    | 所有数字类型   | 返回A的平方根。                                                                                                                                                |
| LN(A)                                                                                      | 所有数字类型   | 返回A的自然对数（基数e）。                                                                                                                                          |
| LOG10(A)                                                                                   | 所有数字类型   | 返回A的基数10对数。                                                                                                                                             |
| LOG2(A)                                                                                    | 所有数字类型   | 返回A的基数2对数。                                                                                                                                              |
| LOG(B) LOG(A, B)                                             | 所有数字类型   | 当只有一个参数，返回B的自然对数（基数e）。 当有两个参数，返回B以A为基数的对数。 B必须大于0，且A必须大于1。                                    |
| EXP(A)                                                                                     | 所有数字类型   | 返回e的a次方。                                                                                                                                                |
| CEIL(A) CEILING(A) | 所有数字类型   | 将参数向上舍入为最接近的整数。例如ceil(21.2)，返回22。                                                                                                                       |
| FLOOR(A)                                                                                   | 所有数字类型   | 对给定数据进行向下舍入最接近的整数。例如floor(21.2)，返回21。                                                                                                                   |
| SIN(A)                                                                                     | 所有数字类型   | 计算给定A的正弦值。                                                                                                                                              |
| COS(A)                                                                                     | 所有数字类型   | 计算给定A的余弦值。                                                                                                                                              |
| TAN(A)                                                                                     | 所有数字类型   | 计算给定A的正切值。                                                                                                                                              |
| COT(A)                                                                                     | 所有数字类型   | 计算给定A的余切值。                                                                                                                                              |
| ASIN(A)                                                                                    | 所有数字类型   | 计算给定A的反正弦值。                                                                                                                                             |
| ACOS(A)                                                                                    | 所有数字类型   | 计算给定A的反余弦值。                                                                                                                                             |
| ATAN(A)                                                                                    | 所有数字类型   | 计算给定A的反正切值。                                                                                                                                             |
| ATAN2(A, B)                                                                                | 所有数字类型   | 计算给定坐标(A, B)的反正切值。                                                                                                                                      |
| COSH(A)                                                                                    | 所有数字类型   | 计算给定A的双曲余弦值。返回类型为DOUBLE。                                                                                                                                |
| DEGREES(A)                                                                                 | 所有数字类型   | 返回弧度所对应的角度。                                                                                                                                             |
| RADIANS(A)                                                                                 | 所有数字类型   | 返回角度所对应的弧度。                                                                                                                                             |
| SIGN(A)                                                                                    | 所有数字类型   | 返回a所对应的正负号，a为正返回1，a为负，返回-1，否则返回0。                                                                                                                       |
| ROUND(A, d)                                                                                | 所有数字类型   | 返回小数部分，d位之后数字的四舍五入，d为int型。例如round(21.263,2)，返回21.26。                                                                                                    |
| PI                                                                                         | 所有数字类型   | 返回pi的值。                                                                                                                                                 |
| E()                                                                                        | 所有数字类型   | 返回e的值。                                                                                                                                                  |
| RAND()                                                                                     | 所有数字类型   | 返回一个0.0和1.0之间的随机double类型的数（包含0.0，不包含1.0）。                                                                                                               |
| RAND(A)                                                                                    | 所有数字类型   | 根据初始化种子A，返回一个0.0和1.0之间的随机double类型的数（包含0.0，不包含1.0）。若初始化种子相同，则返回的随机数相同。                                                                                   |
| RAND_INTEGER(A)                                                                            | 所有数字类型   | 返回一个0和A之间的随机整数（包含0，不包含A）。                                                                                                                               |
| RAND_INTEGER(A, B)                                                                         | 所有数字类型   | 根据初始化种子A，返回一个0和B之间的随机整数值（包含0，不包含B）                                                                                                                      |
| UUID()                                                                                     | 所有数字类型   | 返回一个UUID字符串。                                                                                                                                            |
| BIN(A)                                                                                     | 所有数字类型   | 返回一个整数A的二进制字符串。如为null则返回null。                                                                                                                           |
| HEX(A) HEX(B)                                                | 所有数字类型   | 返回一个整数A或者字符串B的十六进制字符串。若A或B为null，则返回null。                                                                                                                |
| TRUNCATE(A, d)                                                                             | 所有数字类型   | 返回保留小数点后d为小数的数字。若A或d为null，则返回null。 例如：truncate(42.345, 2) = 42.340 truncate(42.345) = 42.000 |
| PI()                                                                                       | 所有数字类型   | 返回pi的值                                                                                                                                                  |
   
**注意事项**
字符串类型不能参与算术运算。
