首页 / 字符串
INSTR 查找子串位置
INSTR 返回子串在字符串中第一次出现的位置,下标从 1 开始,找不到时返回 0。多数引擎同名可用,Hologres 要改用 STRPOS。只有 MaxCompute 支持起始位置和第 N 次出现这两个参数,LOCATE 和 POSITION 的参数顺序与 INSTR 相反。
各引擎写法
| 引擎 | 支持 | 写法 | 说明 | 依据 |
|---|---|---|---|---|
| MaxCompute | 支持 | INSTR(str1, str2[, start_position[, nth_appearance]]) | 找不到时返回 0,str2 为空串时返回 1,任一参数为 NULL 时返回 NULL。start_position 为负数时从末尾倒数,nth_appearance 必须大于 0。 | 官方文档 |
| Hologres | 需改写 | STRPOS(str, substr) | INSTR 是 Oracle 兼容函数,需要先安装 orafce 扩展才能用,支持起始位置和第 N 次出现。不装扩展时用 STRPOS。 | 官方文档 |
| StarRocks | 支持 | instr(str, substr) | 按字符计数,下标从 1 开始,找不到时返回 0。需要指定起始位置时用 locate(substr, str, pos)。 | 官方文档 |
| Doris | 支持 | INSTR(str, substr) | 区分大小写,按 UTF-8 字符计算位置。找不到时返回 0,substr 为空串时返回 1,任一参数为 NULL 时返回 NULL。 | 官方文档 |
| Hive | 支持 | instr(str, substr) | 下标从 1 开始,找不到时返回 0,任一参数为 NULL 时返回 NULL。需要起始位置时用 locate(substr, str, pos)。 | 官方文档 |
| Spark SQL | 支持 | instr(str, substr) | Spark 1.5.0 起提供,下标从 1 开始。需要起始位置时用 locate(substr, str, pos)。 | 官方文档 |
| Flink SQL | 支持 | INSTR(string1, string2) | 任一参数为 NULL 时返回 NULL。需要起始位置时用 LOCATE(string1, string2, integer),找不到时返回 0。 | 官方文档 |
迁移注意事项
- LOCATE 和 POSITION 的参数顺序与 INSTR 相反:INSTR(str, substr),LOCATE(substr, str)。改写时最容易把两个参数写反,结果通常是 0。
- MaxCompute 的三参数和四参数写法,例如 INSTR(s, 'e', 3, 2),在 StarRocks、Doris、Hive、Spark 和 Flink 中都没有对应写法。只传起始位置时可以改成 LOCATE,取第 N 次出现时需要改写成多步计算。
- Hologres 的 INSTR 依赖 orafce 扩展。没有安装扩展时 SQL 会报函数不存在,改用 STRPOS 即可。
- 子串为空串时,MaxCompute 和 Doris 文档写明返回 1,其他引擎文档没有说明。用 INSTR(s, x) > 0 判断包含关系时,x 可能为空串的场景要单独处理。
示例
判断备注中是否包含“退款”
SELECT order_id FROM orders WHERE INSTR(remark, '退款') > 0;SELECT order_id FROM orders WHERE STRPOS(remark, '退款') > 0;SELECT order_id FROM orders WHERE instr(remark, '退款') > 0;SELECT order_id FROM orders WHERE INSTR(remark, '退款') > 0;SELECT order_id FROM orders WHERE instr(remark, '退款') > 0;SELECT order_id FROM orders WHERE instr(remark, '退款') > 0;SELECT order_id FROM orders WHERE INSTR(remark, '退款') > 0;