修剪完整字符串,而不是字符 - Redshift

问题描述 投票:0回答:1

这与here是同一个问题,但那里的答案非常针对 PHP(而且我使用的是 Redshift SQL,而不是 PHP)。

我正在尝试从字符串中删除特定的后缀。我尝试使用 RTRIM,但这会删除任何列出的字符,而不仅仅是完整的字符串。我只希望在存在确切后缀的情况下更改字符串,并且只希望将其替换一次。

例如,

RTRIM("name",' Inc')
会将“XYZ Company Corporation”转换为“XYZ Company Corporatio”。 (删除了最后的“n”,因为它是“Inc”的一部分)

接下来,我尝试使用 CASE 语句来限制不正确的替换,但这仍然没有解决问题,因为它会继续替换原始后缀。

例如,当我运行此命令时:

CASE WHEN "name" LIKE '% Inc' THEN RTRIM("name",' Inc')

我得到以下结果:

“XYZ Association Inc”变为“XYZ Association”。 (它修剪了 Inc,但也修剪了最后的“n”)

我知道我可以使用 REPLACE 函数,但我的理解是,这将替换字符串中任何位置的值,并且我只想在它存在于字符串末尾时进行替换。

如何使用 Redshift 做到这一点? (我没有能力在这里使用任何其他语言或工具)。

sql amazon-redshift trim data-manipulation
1个回答
4
投票

您可以使用

REGEXP_REPLACE
来删除尾随的
 Inc
,方法是使用将
 Inc
锚定到字符串末尾的正则表达式:

CASE WHEN "name" LIKE '% Inc' THEN REGEXP_REPLACE("name", ' Inc$', '')

请注意,鉴于正则表达式only匹配以

 Inc
结尾的字符串,
CASE WHEN "name" LIKE '% Inc'
并不是绝对必要的,因为只有在为真时才会发生替换。然而,将其保留可能会提供更好的性能,因为正则表达式操作可能会花费大量时间。

更好的解决方案是保留

CASE WHEN
并在匹配时简单地删除最后 4 个字符(即
 Inc
):

CASE WHEN "name" LIKE '% Inc' THEN LEFT("name", LENGTH("name")-4)

dbfiddle.uk 上的 PostgreSQL(Redshift 基础)演示

© www.soinside.com 2019 - 2024. All rights reserved.