sql 删去记录中指定字符开头的字符串

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql 删去记录中指定字符开头的字符串相关的知识,希望对你有一定的参考价值。

想删去由“第”开头的字符串,比如“第12”,“第56”等,后面的数字不定,另外该字符串前后都有一个空格。请问应该怎么写SQL语句将这种字符串删除呢?

什么数据库
sqlserver中好像没有正则替换的函数,你得自己写了
CREATE FUNCTION dbo.regexReplace
(
@source ntext, --原字符串
@regexp varchar(1000), --正则表达式
@replace varchar(1000), --替换值
@globalReplace bit = 1, --是否是全局替换
@ignoreCase bit = 0 --是否忽略大小写
)
RETURNS varchar(1000) AS
BEGIN
DECLARE @hr integer
DECLARE @objRegExp integer
DECLARE @result varchar(5000)

EXEC @hr = sp_OACreate 'VBScript.RegExp', @objRegExp OUTPUT
IF @hr <> 0 BEGIN
EXEC @hr = sp_OADestroy @objRegExp
RETURN null
END
EXEC @hr = sp_OASetProperty @objRegExp, 'Pattern', @regexp
IF @hr <> 0 BEGIN
EXEC @hr = sp_OADestroy @objRegExp
RETURN null
END
EXEC @hr = sp_OASetProperty @objRegExp, 'Global', @globalReplace
IF @hr <> 0 BEGIN
EXEC @hr = sp_OADestroy @objRegExp
RETURN null
END
EXEC @hr = sp_OASetProperty @objRegExp, 'IgnoreCase', @ignoreCase
IF @hr <> 0 BEGIN
EXEC @hr = sp_OADestroy @objRegExp
RETURN null
END
EXEC @hr = sp_OAMethod @objRegExp, 'Replace', @result OUTPUT, @source, @replace
IF @hr <> 0 BEGIN
EXEC @hr = sp_OADestroy @objRegExp
RETURN null
END
EXEC @hr = sp_OADestroy @objRegExp
IF @hr <> 0 BEGIN
RETURN null
END

RETURN @result
END

我测试了一下,没有问题:(将字符'第'紧接后面连续出现的数字都替换成空)
print dbo.regexReplace('中国 统计 年鉴 2007 总 第26 期','第\d*','')
结果是 中国 统计 年鉴 2007 总 期
参考技术A delete from 表名 where 字段名 like ' 第%'

追问

这样是把符合条件的记录都删掉了吧?
是不是应该用update操作啊??

追答

哦,你是要替换啊。那用update

update 表名 set 字段名='' where 字段名 like ' 第%'

追问

怪我没说清楚。
除了“第%”,每条记录中还有其他字符串,比如“中国 古典文学 宝库 第65 辑 志 小说”,只是想把里面的“ 第65”去掉。类似的记录还有很多,数字不一样。

比如:
给水 排水 设计 手册 第10 技术 经济
新编 大学 英语 疑难 详解 第3
……
要把以上中“第”及其后面的数字去掉。变成如下:
给水 排水 设计 手册 技术 经济
新编 大学 英语 疑难 详解
……
麻烦再帮我想一下吧,非常感谢!

追答update 表名 
set 字段名=stuff(字段名,charindex(' 第',字段名),charindex(' ',substring(字段名,charindex(' 第',字段名)+1,len(字段名))),' ')
 where 字段名 like ' 第%'

第xx的前后都要有空格才行

追问

刚才试了一下,不知道为什么,0行受影响。没有成功。。是哪里出问题了吗??希望能再帮我解答一下!非常感谢!

参考技术B delete from 表名 where 字段名=‘12%’
直接删除这一行的数据,同时删除本行的自增列编号追问

我不想删掉这些记录,只是想删掉记录中特定的字符串。想知道怎么用更新操作实现?谢谢!

追答

那直接用Update改吧
update 表名 set 列1=值1 (可以有N个列同时更改,用','隔开) where 条件='12%'

追问

能不能写一条语句一起改了?分别针对每个不同的数字写一条太多太麻烦。
给水 排水 设计 手册 第10 技术 经济
新编 大学 英语 疑难 详解 第3
中国 统计 年鉴 2007 总 第26 期
……
要把以上中“第”及其后面的数字去掉。变成如下:
给水 排水 设计 手册 技术 经济
新编 大学 英语 疑难 详解
中国 统计 年鉴 2007 总 期
……

追答

能不能用null来代替或者用“ ”来代替

参考技术C delete from 表A where lefttrim(righttrim(字段名)) like '第%'追问

我不想删掉这些记录,只是想删掉记录中特定的字符串。

想用update操作实现。
还是很感谢!

追答

可以update 表A set 字段名= lefttrim(righttrim(字段名))
where l字段名 like '%第%'

或者
update 表A set 字段名= replace(字段名,' ','')
where l字段名 like '%第%'
括号里第一个单引号里面有一个空格

追问

真的很感谢!!
第一种不是很懂
怎么感觉第二种方法是把符合条件的记录中的空格都去掉啊。。

急!如何批量删除数据库中以特定字符开头和结尾的字符串

比如我pre_forum_post表中 [<i> 本帖最后由 帅的挨刀 于 2008-5-1810:11 编辑 </i>] 这种以 “[<i> 本帖最后由” 开头, 以 "编辑 </i>]"结尾的字段

我需要把表中所有这种字符串全删除

参考技术A 使用正则表达式,先查询,看是否符合你要求:

SELECT * FROM `test` where content regexp '^\\[<i>.*</i>\\]$';

如果是你要的,把select * 换成delete删除
参考技术B 使用编程语言select到内存种,再用正则表达式替换并拼接处update sql,最后执行。
或者如果sql支持正则,也可也直接考虑纯sql语句。

以上是关于sql 删去记录中指定字符开头的字符串的主要内容,如果未能解决你的问题,请参考以下文章

C语言删除字符串中指定字符

SQL 修改字符串中指定字符

JAVA 删除字符串中指定的字符

JAVA 删除字符串中指定的字符

使用sql截取字符串中指定分割符的最后一位

oracle中替换字段中指定字符串的语句