在第二个dot sql之前得到一切

时间:2018-04-18 20:19:48

标签: sql hive

我想在第二个十进制/点之前获取列中的所有内容(列名:test)。该列是字符串格式。

示例:列测试中的数据

 a bc.de.fg
 k.l.o.p

期望输出

a bc.de
k.l

3 个答案:

答案 0 :(得分:1)

您可以创建基于Java的用户定义函数,并将列作为参数传递。

import org.apache.hadoop.hive.ql.exec.UDF;

class UdfClass extends UDF {
    public String evaluate(String input) {
        String arr[]= input.split(".");
        return arr[0]+=arr[1];
    }
}

您需要在Hive中创建一个函数:

 add jar /path/to/youJar.jar;
 create temporary function new_function_name as 'jar_class_name';

之后,您将能够查询:

select new_function_name(test) from teble_name

答案 1 :(得分:0)

这有效:

select 
left((left('a bc.de.fg k.l.o.p' , len('a bc.de.fg k.l.o.p')-charindex('.', reverse('a bc.de.fg k.l.o.p'))) )
 , len((left('a bc.de.fg k.l.o.p' , len('a bc.de.fg k.l.o.p')-charindex('.', reverse('a bc.de.fg k.l.o.p'))) )
 )-charindex('.', reverse((left('a bc.de.fg k.l.o.p' , len('a bc.de.fg k.l.o.p')-charindex('.', reverse('a bc.de.fg k.l.o.p'))) )))) 

答案 2 :(得分:0)

使用locate函数,我们可以在两次迭代中找到第二个“。”的位置。然后使用substr,我们可以获得从位置1到我们到达的数字的字符串内容。

select 
substr("a bc.de.fg k.l.o.p"
,1
,locate(
      substr("a bc.de.fg k.l.o.p", 
             locate("a bc.de.fg k.l.o.p" ,".") +1
          ,1000
      )
      ,"."
) - 1
)