我正在尝试删除一致的已知子字符串(“To Find a”)前面的所有单词。我想批量删除 600 多个Description
字符串中“To Find a”前面的所有内容。这个子字符串前面的单词在所有情况下都是不同的。例如(Description
'Some Text, Some More Text...To Find a... Some More Text')我有几个红色的帖子,并尝试使用 TRIM、CHARINDEX 和 SUBSTRING_INDEX。谢谢您的帮助!
2 回答
如果这是 SQL Server,删除前导位的相对简单的方法是在SUBSTRING和CHARINDEX的帮助下:
SELECT SUBSTRING(ColumnName, CHARINDEX('To Find a', ColumnName), 2147483647)
FROM YourTable;
CHARINDEX 函数查找子字符串的位置,并将结果用作 SUBSTRING 的第二个参数。长度参数设置为最大值int
,以确保返回字符串末尾的所有剩余字符。(您不需要计算确切的数字。)如果未找到子字符串,则 CHARINDEX 返回 0。在此上下文中,作为起始位置的 0 会导致返回整个字符串值。
如果您实际上想要做相反的事情,即保留前导文本并删除其余部分,正如您的评论之一似乎暗示的那样,您可以尝试以这种方式使用 CHARINDEX 和LEFT :
SELECT LEFT(ColumnName, CHARINDEX('To Find a', ColumnName + 'To Find a') - 1)
FROM YourTable;
同样,CHARINDEX 返回'To Find a'
列值中的位置。减去 1 后,即成为 LEFT 的长度参数。为了确保 CHARINDEX 确实找到了搜索词,该词被附加到正在搜索的值:如果原始值没有'To Find a'
,则 CHARINDEX 命中附加位并返回原始字符串最后一个字符之后的位置,当减去,成为字符串的确切长度。
在 SQL Server 中选择前导文本:
DECLARE @String AS VARCHAR(255) = 'Some Text, Some More Text…To Find a… Some More Text'
SELECT LEFT(@String,CHARINDEX('To Find a',@String)-1)
(假设字符串始终存在,如问题所述)
要删除前导文本:
DECLARE @String AS VARCHAR(255) = 'Some Text, Some More Text…To Find a… Some More Text'
SELECT RIGHT(@String,CHARINDEX(REVERSE('To Find a'),REVERSE(@String))-1)
如果您想保留“To Find a”,那么您可以调整-1
查询接近尾声。
更新:
如果 'to find a' 不在每个字符串中,并且使用您的表:
SELECT CASE WHEN CHARINDEX('To Find a',YourField) > 0
THEN LEFT(YourField,CHARINDEX('To Find a',YourField)-1)
ELSE YourField
END AS 'FixedField'
FROM YourTable