---
order: 1
navTitle: 操作符
---
# 表达式操作符

系统中支持的所有表达式操作符如下：

\[\[TOC]]

## 四则运算符{#arithmetic}

| 操作符 | 说明 | 示例 |
| :---------:| :--------| :-------- |
| `+` | 加法运算 | `1+2=3` |
| `-` | 减法运算 | `3-2=1` |
| `*` | 乘法运算 | `3*2=6` |
| `/` | 除法运算 | `6/3=2` |
| `%` | 求模运算 | `3%2=1` |

## 逻辑运算符{#logic}

| 操作符 | 说明 | 示例 |
| :---------:| :--------| :-------- |
| `NOT` | 非运算(与IN、LIKE、CONTAIN等组合使用) |  `[纳税表].[行业] NOT LIKE '%工业%'` 选取纳税行业中不包含'工业'的数据 |
| `!` | 非运算(与=、~等组合使用) | `[纳税表].[月份]!=1` 选取纳税月份不等于1月的数据 |
| `EXISTS` | 存在运算，与SELECT函数构成过滤条件 | `EXISTS SELECT([发票表], [企业信息].[ID]=[发票表].[销方企业] and [企业信息].[失信]='Y')`  过滤出失信企业开具的发票信息 |
| `NOT EXISTS` | 不存在 | `NOT EXISTS SELECT([发票表], [企业信息].[ID]=[发票表].[销方企业] and [企业信息].[失信]='Y')`  过滤出不是失信企业开具的发票信息 |
| `=` | 等于 | `[纳税表].[省份]=420000` 选取纳税省份等于湖北省的数据(不包含下级) ；`[纳税表].[省份].[省市县层次]=420000` 选取纳税省份等于湖北省的数据(包含下级)|
| `BELONG` | 属于，等价于`[维键字段].[默认层次]='xx'` | `[纳税表].[省份] BELONG 420000` 选取纳税省份等于湖北省的数据(包含下级)，等价于 `[纳税表].[省份].[默认层次]=420000`； `420000 BELONG 420000`  BELONG自身时返回true |
| `NOT BELONG` | 不属于(包含自身及下级)，等价于`[维键字段].[默认层次]!='xx'` | `[纳税表].[省份] NOT BELONG 420000` 选取纳税省份不等于湖北省的数据(包含下级)，等价于 `[纳税表].[省份].[默认层次]!=420000`； `420000 NOT BELONG 420000`  BELONG自身时返回false |
| `==`(Deprecated，过时弃用)  | 只等于(用于维项表达式时只等于自身) | `[纳税表].[省份]==420000` 选取纳税省份字段等于`420000`的数据(不包含下级) |
| `>`  | 大于 | `[纳税表].[纳税额]>1000` 选取纳税额大于1000的数据 |
| `<`  | 小于 | `[纳税表].[纳税额]<2000` 选取纳税额小于2000的数据 |
| `>=` | 大于等于 | `[纳税表].[纳税额]>=1000` 选取纳税额大于等于1000的数据 |
| `<=` | 小于等于 | `[纳税表].[纳税额]<=2000` 选取纳税额小于等于2000的数据 |
| `!=` | 不等于| `[纳税表].[省份]!=420000` 选取纳税省份不等于湖北省的数据(不包含下级) ；`[纳税表].[省份].[省市县层次]!=420000` 选取纳税省份不等于湖北省的数据(包含下级) |
| `!==`(Deprecated，过时弃用) | 不等于用于维项表达式时不包含下级 | `[纳税表].[省份]!==420000` 选取纳税省份字段不等于`420000`的数据(不包含下级) |
| `<>` | 不等于 | `[纳税表].[月份]<>1` 同上 |
| `AND` | 逻辑与 | `[纳税表].[月份]=1 AND [纳税表].[地区]='01'` 选取纳税月份为1月且地区为01的数据|
| `&&` | 逻辑与 |  `[纳税表].[月份]=1 AND [纳税表].[地区]='01'` 同上 |
| `OR` | 逻辑或 | `[纳税表].[月份]=1 || [纳税表].[月份]=2` 选取纳税月份为1月或2月的数据 |
| `||` | 逻辑或 | `[纳税表].[月份]=1 || [纳税表].[月份]=2` 同上 |
| `IS` | 连接NULL或NOT NULL关键字 |`[纳税表].[月份] IS NULL` 选取纳税月份为空的数据 |
| `IS NULL` | 等于空 | 同上 |
| `IS NOT NULL` | 不等于空 | `[纳税表].[月份] IS NOT NULL` 选取纳税月份不为空的数据 |
| `BETWEEN` | 与AND搭配，选取介于两个值之间的数据范围 | `[纳税表].[纳税额] BETWEEN 1000 AND 2000` 选取纳税额在1000-2000的数据|
| `IN` | 查询具体范围内数据 | `[纳税表].[地区] IN ('01','02','03')` 选取纳税地区在(01,02,03)范围内的数据|
| `NOT IN` | IN的非运算 | `[纳税表].[地区] NOT IN ('01','02')` 选取纳税地区不在(01,02)范围内的数据|
| `LIKE` | 与通配符组合实现模糊查询 | `[纳税表].[行业] LIKE '%信息%'` 选取纳税行业中包含'信息'的数据 |
| `NOT LIKE` | LIKE的非运算 | `[纳税表].[行业] NOT LIKE '%工业%'` 选取纳税行业中不包含'工业'的数据|
| `CONTAINS` | 包含，灵活查询的操作符，详见[逻辑匹配](./types.md#logic-match)。 | `[纳税表].[行业] CONTAINS '信息|电子'` 选取纳税行业中包含'信息'或者'电子'的数据 |
| `NOT CONTAINS` | 不包含 | `[纳税表].[行业] NOT CONTAINS '信息|电子'` 选取纳税行业中不包含'信息'或者'电子'的数据 |
| `STARTS WITH` | 以xx开头，等价于`LIKE 'xx%'` | `[纳税表].[企业] STARTS WITH '中国'` 选取纳税企业中以'中国'开头的数据 |
| `NOT STARTS WITH` | 不以xx开头，等价于`NOT LIKE 'xx%'` | `[纳税表].[企业] NOT STARTS WITH '中国'` 选取纳税企业中不以'中国'开头的数据 |
| `ENDS WITH` | 以xx结尾，等价于`LIKE '%xx'` | `[纳税表].[企业] ENDS WITH '股份有限公司'` 选取纳税企业中以'股份有限公司'结尾的数据 |
| `NOT ENDS WITH` | 不以xx结尾，等价于`NOT LIKE '%xx'` | `[纳税表].[企业] NOT ENDS WITH '股份有限公司'` 选取纳税企业中不以'股份有限公司'结尾的数据 |
| `MATCH REGEX` | 匹配正则表达式 | `"abc123" MATCH REGEX "[0-9]"` 返回值为true；`"abc123" match regex '^[0-9]'` 返回false |
| `NOT MATCH REGEX` | 不匹配正则表达式 | `"abc123" NOT MATCH REGEX "[0-9]"` 返回值为false；`"abc123" NOT MATCH REGEX '^[0-9]'` 返回true |
| `MATCH TEXT` | 全文检索（与LIKE不同，全文检索引擎会先对搜索字符串进行分词，再基于分词后的词项进行检索）。| `[纳税表].[企业] MATCH TEXT '百度技术'`或者 `[纳税表].[企业] MATCH TEXT '百度公司'`都可以搜索到`百度在线网络技术有限公司`|
| `NOT MATCH TEXT` | 全文检索不匹配 | `'百度在线网络技术有限公司' NOT MATCH TEXT '百度公司'` 返回false|
| `MATCH INITIAL` | 首字母匹配，左侧只能是配置了[首字母字段](../data-gov/model/README.md#model-field)的字段 | `[企业表].[企业名称] MATCH INITIAL 'XM'` 使用`企业名称`关联的首字母字段`企业名称首字母`匹配`XM`|
| `NOT MATCH INITIAL` | 首字母不匹配 | `[企业表].[企业名称] NOT MATCH INITIAL 'XM'` `企业名称`关联的首字母字段`企业名称首字母`不匹配`XM` |

::: warning

1. `==`、`!==`两个操作符在5.0+版本后已经被弃用（Deprecated），仅出于兼容低版本的需要暂未移除，未来版本可能会移除！
2. 对于过滤时是否包含下级维项由操作符左侧的字段决定，如果左侧是普通字段（包括维键），比如`[企业表].[所属地区]`，那么就是过滤字段本身，不包含下级维项；如果左侧是层次字段，比如`[企业表].[所属地区].[省市县层次]`，那么就是按层次过滤，包含下级维项。
   :::

## 括号{#brackets}

| 操作符 | 说明 | 示例 |
| :---------: | :-------- | :-------- |
| `(` | 分隔表达式的计算逻辑 | `IF([利润]>0,"盈利",IF([利润]=0,"盈亏平衡","亏损"))` |
| `)` | 同上 | 同上 |
| `[` | 分隔系统变量(包括数据源字段、用户、位置) | `[纳税表].[月份]  [用户].[用户ID]` |
| `]` | 同上 | 同上 |

## 转义符{#escape}

| 操作符 | 说明 | 示例 |
| :---------: | :-------- | :-------- |
| `,` | 分隔参数、数组项等 | `RANK([利润表].[销量], [利润表].[地区])` |
| `.` | 分隔层级 | `[纳税表].[月份]  [用户].[用户ID]` |

## 数据项分隔符{#delimiter}

系统中使用表达式进行匹配、搜索等支持谷歌搜索引擎类似的基本语法（OR AND等），可以在输入多个数据项时以约定分隔符分隔，配合操作一起使用能快速实现多个数据项条件之间的OR或AND关系。

系统支持如下几种数据项分隔符：

| 操作符 | 说明 | 示例 |
| :---------: | :-------- | :-------- |
| `,` | 分隔多个数据项进行或运算 | `经营状态='开业,存续'`表示选取经营状态为开业或存续的数据 |
| `|` | 分隔多个数据项进行或运算 | `经营状态='开业|存续'`表示选取经营状态为开业或存续的数据 |
| `OR` | 分隔多个数据项进行或运算 | `经营状态='开业 OR 存续'`表示选取经营状态为开业或存续的数据 |
| `&` | 分隔多个数据项进行与运算 |  `企业标签='小规模纳税人&化工'`表示选取企业同时具有`小规模纳税人`和`化工`标签的数据 |
| `AND` | 分隔多个数据项进行与运算，需大写，左右两侧需有空格 |  `企业标签='小规模纳税人 AND 化工'`表示选取企业同时具有`小规模纳税人`和`化工`标签的数据 |
| ` ` (空格)| 分隔多个数据项进行与运算，仅用于`包含`、`检索`两种操作符的场景下 |  `企业标签 contains '小规模纳税人  化工'`表示选取企业标签同时包含`小规模纳税人`和`化工`两种字符的数据 |

::: tip

1. 考虑到不同语言下的使用情况，`AND`、`OR`两种操作符必须是大写且左右两侧都有空格才生效！
2. 可以结合`(`、`)`来实现复杂的结合运算，比如：`*=武汉&(半导体|投资)`表示包含`武汉`和`半导体`，或包含`武汉`和`投资`
3. 当搜索或匹配的字符串中包含操作符时，比如包含`,`和`AND`等操作符需要当做普通字符串看待搜索是，可以使用双引号`"`括起来作为完整的字符串使用，具体参见[其他符号（双引号-"）](#others)
   :::

## 区间范围{#interval}

| 操作符 | 说明 | 示例 |
| :---------: | :-------- | :-------- |
| `~` | 区间范围 | `[销售日期].[年]=2020~2023'`表示`[销售日期].[年]>=2020 AND [销售日期].[年]<=2023` |
| `(` | 左开区间 | `[销售日期].[年]=(2020~2023)'`表示`[销售日期].[年]>2020 AND [销售日期].[年]<2023`  |
| `)` | 右开区间 | 同上  |
| `[` | 左闭区间，左右两个边界值都是闭区间时可省略 | `[销售日期].[年]=[2020~2023]'`表示`[销售日期].[年]>=2020 AND [销售日期].[年]<=2023`  |
| `]` | 右闭区间，左右两个边界值都是闭区间时可省略 |  同上 |

更多使用示例参考：[数值范围匹配](./types.md#number-range)和[日期范围匹配](./types.md#date-range)

## 其他符号{#others}

| 操作符 | 说明 | 示例 |
| :---------:| :-------- | :-------- |
| `CASE WHEN THEN ELSE END` | 实时计算条件函数 | `CASE WHEN  [纳税表].[地区] IN('01','05','07') THEN '北方地区' WHEN [纳税表].[地区] IN('02','03','04','06') THEN'南方地区' ELSE '其他' END` 地区为'01、05、07'返回'北方地区'，'02、03、04、06'返回'南方地区'，其他情况返回'其他' |
| `"` | 当字符串中包括操作符时，左右用`"`括起来的内容当一个完整字符串使用 | `='"(半导体|导体)"'` 表示包含`(半导体|导体)`；  `='\"(半导体|导体)\"'` 表示等于`"(半导体|导体)"` |
