在第二个点sql之前获取所有内容

在第二个点sql之前获取所有内容,sql,hive,Sql,Hive,我想在第二个小数点/点之前获取列(列名:test)中的所有内容。该列为字符串格式 示例:列测试中的数据 a bc.de.fg k.l.o.p 期望输出 a bc.de k.l 这项工作: 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' ,

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

示例:列测试中的数据

 a bc.de.fg
 k.l.o.p
期望输出

a bc.de
k.l
这项工作:

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'))) )))) 

使用
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
) 

您可以创建基于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];
    }
}
您需要在配置单元中创建一个函数:

 add jar /path/to/youJar.jar;
 create temporary function new_function_name as 'jar_class_name';
之后,您将能够进行如下查询:

select new_function_name(test) from teble_name

使用
charindex
twiceSee如下,并将“a bc.de.fg k.l.o.p”替换为您的列名。如果这是您经常遇到的问题,您可能需要考虑添加一个函数(用分隔符拆分字段并在特定位置访问子字符串)