我正在尝试删除一致的已知子字符串前面的所有单词(“To Find a”)。我想删除600多个Description
字符串中批量删除前面的所有内容。在所有情况下,此子字符串前面的单词都不同。例如(Description
'一些文本,一些更多文本...要查找...更多文本')我有其他几个帖子,并尝试使用TRIM,CHARINDEX和SUBSTRING_INDEX。
谢谢您的帮助!
答案 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,在SUBSTRING和CHARINDEX的帮助下,删除前导位的相对简单的方法是:
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,当被减去时,变成字符串的确切长度。