PostgreSQL:在第一个分隔符实例之后提取子字符串

时间:2018-12-27 17:17:57

标签: sql postgresql

我正在尝试在定界符的第一个实例之后提取所有内容。 例如:

01443-30413 -> 30413
1221-935-5801 -> 935-5801

我尝试了以下查询:

select regexp_replace(car_id, E'-.*', '') from schema.table_name;
select reverse(split_part(reverse(car_id), '-', 1)) from schema.table_name;

但是他们两个都返回:

  • 01443-30413-> 30413
  • 1221-935-5801-> 5801

因此,如果定界符出现多次,它将不起作用。

我使用的是Postgresql11。我来自MySQL背景,您可以这样做:

select SUBSTRING(car_id FROM (LOCATE('-',car_id)+1)) from table_name

4 个答案:

答案 0 :(得分:2)

为什么不只将MySQL方法等同于PG并对其进行子串处理?

SELECT SUBSTRING('abcdef-ghi' FROM POSITION('-' in 'abcdef-ghi') + 1) 

如果您不喜欢用“ from”和“ in”方式编写参数,则PG还具有“常规”逗号分隔功能:

SELECT SUBSTR('abcdef-ghi', STRPOS('abcdef-ghi', '-') + 1)

答案 1 :(得分:1)

我认为regexp_replace是合适的,但是使用正确的模式:

select regexp_replace('1221-935-5801', E'^[^-]+-', '');

935-5801

正则表达式模式^[^-]+-从字符串的开头匹配一个或多个非破折号,并以破折号结尾。然后将其替换为空字符串,从而有效地删除了此内容。

请注意,如果输入中根本没有破折号,则此方法也适用,在这种情况下,它将只返回原始输入。

答案 2 :(得分:1)

使用此正则表达式模式:

select regexp_replace('1221-935-5801', E'^[^-]+-', '') from schema.table_name

正则表达式说明:

  • ^是字符串的开头
  • [^-]+表示至少一个与-不同的字符
  • ...直到遇到-字符

答案 3 :(得分:0)

我通常以常规方式尝试过  类似于instr as postgrsql中的strpos。)可以尝试以下

    SELECT
     SUBSTR(car_id,strpos(car_id,'-')+1,
     length(car_id) ) from table ;