postgres string compare

时间:2016-07-11 16:03:37

标签: regex postgresql

我正在使用postgres版本8.3(greenplum)。我试图比较一个名为col_name的列上的两个表。我需要的是两个列行值的部分字符串比较。值为xx.yyy.zzz。我想拉出第一部分即' xx'然后截断,即' .yyy.zzz'。我只想比较字符串的两行,直到遇到第一个句点。字符串xx的部分可能具有不同的字符长度。

我使用以下逻辑,但我不明白为什么它不起作用:

select 
distinct x.col_name, 
x.col_num
from table_A x  
left outer join table_b y 
on 
regexp_matches((x.col_name,'^(?:([^.]+)\.?){1}',1),(y.col_name,'^(?:([^.]+)\.?){1}', 1)) 
and x.col_num=y.col_num;

我收到此错误:

  

错误:函数regexp_matches(记录,记录)不存在LINE   36:regexp_matches((x.col_name,' ^(?:([^。] +)。?){1}',1),(y ....            ^提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。   **********错误**********

     

错误:函数regexp_matches(记录,记录)不存在SQL   state:42883提示:没有函数匹配给定的名称和参数   类型。您可能需要添加显式类型转换。性格:917

任何人都可以帮助我吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以使用split_part功能。使用'.'作为分隔符将字符串拆分为部分,并比较第一个组件 见documentation

所以你的查询是:

select 
  distinct x.col_name, 
  x.col_num
from table_A x  
  left outer join table_b y 
    on split_part(x.col_name, '.', 1) = split_part(y.col_name, '.', 1) 
    and x.col_num=y.col_num;

您的原始查询会产生错误,因为您为regexp_matches函数提供了奇怪的参数 签名是regexp_matches(string text, pattern text [, flags text]),但你的第一个参数是(x.col_name,'^(?:([^.]+)\.?){1}',1),它不是一个字符串(同样适用于第二个参数)