有没有办法有条件地替换字符串中的第一个“ /”?

时间:2019-05-08 17:42:04

标签: regex postgresql

使用Postgres 9.6,处理数百万行数据。如何将反斜杠“ /”替换为破折号“-”?问题是,在字符串中再输入几个单词后,我们要使用正斜杠,并且我们希望保留该斜杠,因此,基本上,如果存在多个正斜杠,则将第一个斜杠替换为破折号,而对第二个斜杠不做任何处理,如果存在只是一个正斜杠,那么什么也不做。

我尝试了split_part()substring(),但没有一个起作用。首先,我想在选择查询中知道,然后我要第二步替换它。在下面的代码中,column1varchar列,这是我要进行更改的地方。

Data Example:
Current - someName/abc-def-tn/more-random-names
Expected - someName-abc-def-tn/more-random-names

注意:someName的长度不是固定的,因此不能使用定位。

select column1, 
reverse(split_part(reverse(column1), '/', 1)) as new_column_part1,
substring(column1, '[^/]*$') as new_url, as new_column_part2
from tableA

2 个答案:

答案 0 :(得分:3)

regexp_replace()仅替换第一次出现-除非您添加joins(:hearings => :hearing_day) .where("hearing_days.scheduled_for = (SELECT MAX(hearing_days.scheduled_for) FROM hearing_days WHERE hearings.appeal_id = appeals.id)") .where(hearings: { disposition: "held" }) 作为可选的第4个参数,否则它将替换所有出现的情况。

仅当有第二个事件时,才想替换第一个事件。两种解决方案:

'g'

SELECT col , CASE WHEN col ~ '/.*/' -- only where there are two or more THEN regexp_replace(col, '/', '-') ELSE col END AS new_col , regexp_replace(col, '/(?=.*/)', '-') AS new_col2 FROM tbl; new_col2positive lookahead的作用相同。也许更优雅,但是我不确定它是否更快(或更容易阅读)。

在实际的new_col中,我会这样做:

UPDATE

这还有一个额外的好处,就是只触摸实际需要它的行。参见:

答案 1 :(得分:0)

regexp_replace()替换字符串的首次出现,例如:

regexp_replace('someName/abc-def-tn/more-random-names', '/', '-', '{1}')

让我知道这是否可行