删除一致的已知子字符串前面的所有单词

时间:2013-09-06 17:02:31

标签: sql string substring

我正在尝试删除一致的已知子字符串前面的所有单词(“To Find a”)。我想删除600多个Description字符串中批量删除前面的所有内容。在所有情况下,此子字符串前面的单词都不同。例如(Description'一些文本,一些更多文本...要查找...更多文本')我有其他几个帖子,并尝试使用TRIM,CHARINDEX和SUBSTRING_INDEX。 谢谢您的帮助!

2 个答案:

答案 0 :(得分: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)

如果您想保留“要查找”,请在查询结尾附近调整-1

更新

如果'找到'不在每个字符串中,并且使用你的表:

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

答案 1 :(得分:0)

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

SELECT SUBSTRING(ColumnName, CHARINDEX('To Find a', ColumnName), 2147483647)
FROM YourTable;

CHARINDEX函数查找子字符串的位置,结果用作SUBSTRING的第二个参数。 length参数设置为最大int值,以确保返回字符串末尾的所有剩余字符。 (您不需要计算确切的数字。)如果找不到子字符串,则CHARINDEX返回0.在此上下文中,0作为起始位置会导致返回整个字符串值。

如果你真的想要反过来,即保留主要文本并删除其余内容,正如你的一条评论似乎暗示的那样,你可以尝试使用CHARINDEX和LEFT in这样:

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