我正在尝试在定界符的第一个实例之后提取所有内容。 例如:
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
答案 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 ;