在Apache演练中,查询以查找字符串中第N个字符出现

时间:2018-07-23 08:10:26

标签: sql apache-drill

我想要字符串中'/'的位置,其中'/'重复多次并且字符串的长度不同。

在Apache演练中,INSTR()将无法在字符串中找到第N个字符。即INSTR('/ This / looks / like / homework','/',1,3)的输出为12,此查询在Apache钻探中不起作用。

我想在Apache演练中第N次出现时的位置'/'。

请帮助我解决问题。

2 个答案:

答案 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