我想要字符串中'/'的位置,其中'/'重复多次并且字符串的长度不同。
在Apache演练中,INSTR()将无法在字符串中找到第N个字符。即INSTR('/ This / looks / like / homework','/',1,3)的输出为12,此查询在Apache钻探中不起作用。
我想在Apache演练中第N次出现时的位置'/'。
请帮助我解决问题。
答案 0 :(得分:1)
0: jdbc:drill:> SELECT STRPOS(a, REGEXP_REPLACE(a, '^\/.*?\/.*?\/.*?\/',''))-1 from (VALUES('/This/is/apache/drill/queries')) t(a);
+---------+
| EXPR$0 |
+---------+
| 16 |
+---------+
1 row selected (0.15 seconds)
答案 1 :(得分:0)
这是来自追溯用户邮件列表的。希望它将对您有所帮助: http://mail-archives.apache.org/mod_mbox/drill-user/201509.mbox/%3CB6A39848-AACB-4AD2-BD62-58C395D6CC9E@maprtech.com%3E
还可以使用POSTION,STRPOS或LOCATE在字符串中查找子字符串并返回位置。
LOCATE是最有用的IMO,因为它允许您指定从何处开始搜索字符串,但是这些都不具有INSTR或substring-index功能来指定要查找子字符串的出现位置。
UDF的好例子。
以下是解决子查询的方法,该子查询可以分解IP地址的不同部分。
select p2.ip_address, p2.part1, p2.part2, substr(p2.rest2, 1, locate('.',p2.rest2)-1) as part3,
substr(rest2, locate('.',rest2)+1) as part4
from
(select p1.ip_address, p1.part1, substr(rest1, 1, locate('.',rest1)-1) as part2,
substr(rest1, locate('.',rest1)+1) as rest2
from
(select ip_address, substr(ip_address, 1, locate('.',ip_address)-1) as part1,
substr(ip_address, locate('.',ip_address)+1) as rest1 from `/ip`) as p1) as p2
+---------------+--------+--------+--------+--------+
| ip_address | part1 | part2 | part3 | part4 |
+---------------+--------+--------+--------+--------+
| 172.16.254.1 | 172 | 16 | 254 | 1 |
+---------------+--------+--------+--------+--------+
您可以在此处找到所有受支持的Drill字符串函数: https://drill.apache.org/docs/string-manipulation/#strpos