Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 删除一致的已知子字符串前面的所有单词_Sql_String_Substring - Fatal编程技术网

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

Sql 删除一致的已知子字符串前面的所有单词,sql,string,substring,Sql,String,Substring,我试图删除一致的已知子字符串前面的所有单词(“找到一个”)。我想删除“to Find a”前面的所有内容,批量超过600个Description字符串。此子字符串前面的单词在所有情况下都是不同的。例如(Description'Some Text,Some More Text…,以查找…Some More Text')我将其他几篇文章用红色表示,并尝试使用TRIM、CHARINDEX和SUBSTRING\u INDEX。 谢谢你的帮助 在SQL Server中选择前导文本: DECLARE @St

我试图删除一致的已知子字符串前面的所有单词(“找到一个”)。我想删除“to Find a”前面的所有内容,批量超过600个
Description
字符串。此子字符串前面的单词在所有情况下都是不同的。例如(
Description
'Some Text,Some More Text…,以查找…Some More Text')我将其他几篇文章用红色表示,并尝试使用TRIM、CHARINDEX和SUBSTRING\u INDEX。
谢谢你的帮助

在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)
(假设字符串始终存在,如所述)

要删除前导文本,请执行以下操作:

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”(查找a),那么您可以在查询末尾附近调整
-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

如果这是SQL Server,则删除前导位的相对简单的方法是借助和:

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

如果您真的想做相反的事情,即保留前导文本并删除其余部分,正如您的一条评论所暗示的那样,您可以尝试使用CHARINDEX,并通过以下方式:

SELECT LEFT(ColumnName, CHARINDEX('To Find a', ColumnName + 'To Find a') - 1)
FROM YourTable;

同样,CHARINDEX返回
'的位置,以便在列值中找到“
”。减去1后,它将成为LEFT的长度参数。为了确保CHARINDEX确实找到了搜索项,该项被附加到被搜索的值中:如果原始值没有找到“”的
,CHARINDEX将点击附加位并返回原始字符串最后一个字符后的位置,减去后,成为字符串的精确长度。

您的RDBMS供应商是什么?您到底尝试了什么?您提到的功能是可以实现的。不确定RDBMS供应商是什么意思。。。对不起,我忘记我试过什么了。我对SQL非常陌生,我只是尝试应用在这个网站上找到的各种方法。。。但是你用的是哪种数据库管理系统?神谕博士后?DB2?SQL Server?火鸟?MySQL?如果“To Find a”是@string的前导文本,它会遇到错误“传递给LEFT或SUBSTRING函数的长度参数无效”。问题状态为“一致的已知子字符串”。不幸的是,我不确定如何使用“DECLARE@string AS VARCHAR(255)”更具体地说,我在一个名为
Description
的字段中有数百个随机描述的视频。但是,我发现很多人在描述的中间都有“找A”这个词作为我想删除的剩余描述的起点。每个描述的开头也不同。如果可能的话,我尽量避免一个接一个地做。你可能已经回答了我的问题,我只是不知道如何实现它。对不起我的无知。谢谢你的帮助!所以你想在“找到一个”之前保留这个角色,对吗?变量只是测试字符串操作的一种方法,您创建一个变量
@string
,然后
选择它而不是您的表,我将调整上面的答案。