0

我正在尝试删除一致的已知子字符串(“To Find a”)前面的所有单词。我想批量删除 600 多个Description字符串中“To Find a”前面的所有内容。这个子字符串前面的单词在所有情况下都是不同的。例如(Description'Some Text, Some More Text...To Find a... Some More Text')我有几个红色的帖子,并尝试使用 TRIM、CHARINDEX 和 SUBSTRING_INDEX。谢谢您的帮助!

4

2 回答 2

0

如果这是 SQL Server,删除前导位的相对简单的方法是在SUBSTRINGCHARINDEX的帮助下:

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 命中附加位并返回原始字符串最后一个字符之后的位置,当减去,成为字符串的确切长度。

于 2013-09-10T22:14:53.473 回答
0

在 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
于 2013-09-06T17:16:02.680 回答