PostgreSQL如何从单列批量修剪多种后缀字符?
解决PostgreSQL中修剪车站名称后缀的问题
你之前用RTRIM没达到预期,是因为RTRIM的作用是移除字符串末尾任意包含在第二个参数里的字符,而不是匹配整个后缀。比如RTRIM(station_name,' (Temp)')会把末尾的空格、(、T、e、m、p、)逐个去掉,不是精准移除整个(Temp)后缀,所以结合CASE WHEN也容易出问题。
下面提供两种靠谱的实现方法:
方法1:使用正则表达式替换(推荐)
用REGEXP_REPLACE可以精准匹配并移除指定的整个后缀,一次处理多种情况:
SELECT station_name, REGEXP_REPLACE(station_name, '\s*(\(Temp\)|-\s*SW)$', '') AS cleaned_station_name FROM station_data;
正则说明:
\s*:匹配零个或多个空格(处理后缀前可能带空格的情况)(\(Temp\)|-\s*SW):匹配两种后缀模式,|表示“或”\(Temp\):转义括号,精准匹配(Temp)-\s*SW:匹配-后带零个或多个空格,再跟上SW
$:匹配字符串结尾,确保只替换末尾的后缀
方法2:使用CASE WHEN精准匹配
如果不想用正则,也可以用CASE WHEN结合LIKE和字符串截取:
SELECT station_name, CASE WHEN station_name LIKE '% (Temp)' THEN LEFT(station_name, LENGTH(station_name) - 7) -- 7是' (Temp)'的长度 WHEN station_name LIKE '% - SW' THEN LEFT(station_name, LENGTH(station_name) - 5) -- 5是' - SW'的长度 ELSE station_name END AS cleaned_station_name FROM station_data;
测试结果
用你的示例数据测试两种方法,都会得到期望的结果:
| station_name | cleaned_station_name |
|---|---|
| north_station | north_station |
| east_station | east_station |
| south_station | south_station |
| south_station (Temp) | south_station |
| south_station - SW | south_station |
内容的提问来源于stack exchange,提问作者mccruz000
相关产品推荐
相关产品推荐

