使用Postgres 9.6,处理数百万行数据。如何将反斜杠“ /”替换为破折号“-”?问题是,在字符串中再输入几个单词后,我们要使用正斜杠,并且我们希望保留该斜杠,因此,基本上,如果存在多个正斜杠,则将第一个斜杠替换为破折号,而对第二个斜杠不做任何处理,如果存在只是一个正斜杠,那么什么也不做。
我尝试了split_part()
和substring()
,但没有一个起作用。首先,我想在选择查询中知道,然后我要第二步替换它。在下面的代码中,column1
是varchar
列,这是我要进行更改的地方。
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
答案 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_col2
和positive lookahead的作用相同。也许更优雅,但是我不确定它是否更快(或更容易阅读)。
在实际的new_col
中,我会这样做:
UPDATE
这还有一个额外的好处,就是只触摸实际需要它的行。参见:
答案 1 :(得分:0)
regexp_replace()替换字符串的首次出现,例如:
regexp_replace('someName/abc-def-tn/more-random-names', '/', '-', '{1}')
让我知道这是否可行