是否可以从单个列中修剪多个条件?

Possible to TRIM multiple criteria from a single column?

提问人:mccruz000 提问时间:8/30/2023 最后编辑:mccruz000 更新时间:9/1/2023 访问量:85

问:

这里是新手。列中的站点名称末尾有额外的字符。我想在PostgreSQL中修剪它们。

例如,这可以删除末尾的“(Temp)”。

   SELECT
   station_name,
   RTRIM(station_name,' (Temp)')     
   FROM station_data

我还想删除“-SW”。

示例数据可能如下所示:

    north_station
    east_station
    south_station
    south_station (Temp)
    south_station - SW

理想的结果如下所示:

   north_station
   east_station
   south_station
   south_station
   south_station

我尝试过将 CASE WHEN 或 OR 与 RTRIM 一起使用,但设置/顺序错误,或者不能结合使用?谢谢。

SQL PostgreSQL 修剪

评论

1赞 esqew 8/30/2023
RTRIM(RTRIM(station_name,' (Temp)'), ' - SW')也许?

答:

0赞 Tim Biegeleisen 8/30/2023 #1

假设电台名称始终为单个单词,则可以使用以下正则表达式替换方法:

SELECT station_name, REGEXP_REPLACE(station_name, ' .*', '') AS station_name_out
FROM station_data;
1赞 Jonas Metzler 8/30/2023 #2

如果数据总是具有这种形式,即首先是一个带有电台名称的字符串,然后是一个空格,然后是另一个包含一些附加信息的字符串,我们可以只用来选择第一个空格之前的部分:SPLIT_PART

SELECT
  station_name, 
  SPLIT_PART(station_name, ' ', 1) AS newStationName
FROM station_data;

这里有一个基于示例数据的 db<>fiddle

如果您有其他用例并需要更复杂的解决方案,请扩展问题以显示这些用例。

0赞 Shahzad Ali 8/30/2023 #3

您可以使用 REPLACE 函数。此函数允许您将特定子字符串替换为另一个子字符串。通过连续使用两次 REPLACE,可以从工作站名称中删除“(Temp)”和“- SW”。这就像剥离两层:首先,你去掉'(Temp)',然后你去掉'-SW'。这将为您提供要查找的已清理的电台名称。

SELECT station_name, REPLACE(REPLACE(station_name, ' (Temp)', ''), ' - SW', '') as trimmed_station_name FROM station_data;

希望这对你有用。

评论

0赞 Jonas Metzler 8/30/2023
如果出现更多应该删除的文本,这将变得非常不方便
0赞 mccruz000 8/31/2023
这奏效了,谢谢!当 start_station ~ ' - SW$' THEN REGEXP_REPLACE(start_station, ' - SW$', '') ELSE start_station AS trimmed_station 时,也得到了 CASE CASE
0赞 Codemaker2015 8/30/2023 #4

SPLIT_PART是 PostgreSQL 中可用的字符串操作函数。

SPLIT_PART(input_string, delimiter, segment_number)
  • input_string:这是您要从中提取的字符串 段。
  • delimiter:分隔符是字符或子字符串 用于分隔输入字符串中的各个段。
  • segment_number:这是您要放置的区段的位置 提取。它是一个正整数。

您可以使用函数从字符串中修剪某些部分。SPLIT_PART

SELECT
    station_name,
    SPLIT_PART(station_name, ' ', 1) as changed_station_name
FROM station_data;
-1赞 motoaima 9/1/2023 #5

您可以使用REGEXP_REPLACE函数从站名末尾删除“(Temp)”和“- SW”。试试这段代码:

SELECT station_name, 
REGEXP_REPLACE(REGEXP_REPLACE(station_name, ' \\(Temp\\)$', ''), ' - SW$', '') AS cleaned_station_name
FROM station_data;