【问题标题】:In Apache drill, query to find the Nth occurrence of a character in a string在 Apache Drill 中,查询以查找字符串中第 N 次出现的字符
【发布时间】:2018-07-23 08:10:26
【问题描述】:

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

在 Apache 演练中,INSTR() 无法在字符串中查找第 N 次出现的字符。即 INSTR('/This/looks/like/homework', '/',1,3) 获取输出为 12,此查询在 Apache Drill 中不起作用。

我想要 Apache 演练中第 N 次出现的“/”的位置。

请帮助我解决问题。

【问题讨论】:

    标签: sql apache-drill


    【解决方案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)
    

    【讨论】:

      【解决方案2】:

      这是来自钻用户邮件列表。希望对您有所帮助: 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      |
      +---------------+--------+--------+--------+--------+
      

      您可以在此处找到所有支持的钻柱功能: https://drill.apache.org/docs/string-manipulation/#strpos

      【讨论】:

      • 首先感谢您的回复。从字符串 '/This/looks/like/homework' 我想获取子字符串 'like'。但是您的上述查询将不起作用,因为 '/' 在字符串的开头。您能帮我获取子字符串 'like' 吗?注意:字符串的长度会有所不同,因此“/”的位置也会有所不同。
      • 请帮我解决上述问题。
      • 可以在查询中使用split获取'/'之间的部分字符串:SELECT split(a, '/')[3] FROM (VALUES('/This/looks/like/homework')) t(a);
      猜你喜欢
      • 2011-02-04
      • 2010-12-25
      • 1970-01-01
      • 2016-11-21
      • 1970-01-01
      • 2013-09-26
      • 2018-08-24
      • 2018-03-22
      相关资源
      最近更新 更多