我正在使用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
任何人都可以帮助我吗?
谢谢!
答案 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)
,它不是一个字符串(同样适用于第二个参数)