sqlserver 如何删除某特定字符串里的一段,也可以说是截取

qq_28867275 2017-08-07 01:09:20


如果用SQL去掉文明这行字符串如何实现?要求在不知道序号的情况下,序号和内容有所变化,就文明特定不变
解释:有可能下条数据 文明是第6条或者第3条,以【文明】开头,内容不太相同。
求各位数据库大神指点。谢谢!
---------------------------------------------------------------------------------
create table test (
id char(5) not null,
content varchar(2000) null,
constraint PK_TEST primary key (id)
)
-------------------------------------------------------------------------------
1、[守时]按时到校,不准迟到、早退和旷课
2、[夜晚]晚上就寝铃响后不准在校园内逗留
3、[骑车]骑自行车进出校门必须下车
4、[文明]不准在校园内追逐打闹,不得有说脏话、骂人、吵架等不文明行为
5、[打架]严禁打架斗殴,更不准纠集校外人员来闹事。严禁偷盗、敲诈等违法行为
--------------------------------------------------------------------------------------------------------------------
...全文
1540 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
繁花尽流年 2017-08-09
  • 打赏
  • 举报
回复
上面那段最后补个stuff切掉第一格换行符
繁花尽流年 2017-08-09
  • 打赏
  • 举报
回复
/*添加一个拆分字符串函数
CREATE FUNCTION [dbo].[fn_split] ( @String NVARCHAR(MAX) ,  
                                 @Str NVARCHAR(20),
								 @distinct BIT )  
RETURNS @table TABLE ( Value NVARCHAR(MAX),orders int)  
AS   
BEGIN  
    
    DECLARE @i INT ,  
        @j INT ,  
        @l INT ,  
        @v NVARCHAR(MAX),
		@orders int

    SET @i = 0  
    SET @j = 0  
    SET @l = LEN(@String)  
	set @orders=1

    WHILE ( @j < @l )   
        BEGIN  
            SET @j = CHARINDEX(@Str, @String, @i + 1)  
            IF @j = 0   
                SET @j = @l + 1  
            SET @v = SUBSTRING(@String, @i + 1, @j - @i - 1 )  
            
			IF @v <> '' AND (@distinct = 0 OR NOT EXISTS (SELECT 1 FROM @table WHERE Value = @v))
				INSERT  INTO @table  
				VALUES  ( LTRIM(RTRIM(@v)),@orders) 

            SET @i = @j + LEN(@Str) - 1
			set @orders=@orders+1
        END  
    RETURN   
END  
*/

--正文
DECLARE @str NVARCHAR(MAX)

SET @str=N'1、[守时]按时到校,不准迟到、早退和旷课
2、[夜晚]晚上就寝铃响后不准在校园内逗留
3、[骑车]骑自行车进出校门必须下车
4、[文明]不准在校园内追逐打闹,不得有说脏话、骂人、吵架等不文明行为
5、[打架]严禁打架斗殴,更不准纠集校外人员来闹事。严禁偷盗、敲诈等违法行为'

SELECT
	(SELECT CHAR(10)+CAST(ROW_NUMBER() OVER(ORDER BY orders) AS NVARCHAR)+RIGHT([Value],LEN([Value])-1)
		FROM dbo.fn_split(@str,CHAR(10),1) --如果是回车就换成CHAR(13)
		WHERE [Value] NOT LIKE '%[文明]%' FOR XML PATH ('') 
	,TYPE).value('.','NVARCHAR(MAX)') AS new_str 
应该满足LZ了
zbdzjx 2017-08-08
  • 打赏
  • 举报
回复
上面的有点小问题,修正后如下:
with t1(id, c1) as(
Select '123',N'1、[守时]按时到校,不准迟到、早退和旷课
2、[夜晚]晚上就寝铃响后不准在校园内逗留
3、[骑车]骑自行车进出校门必须下车
4、[文明]不准在校园内追逐打闹,不得有说脏话、骂人、吵架等不文明行为
5、[打架]严禁打架斗殴,更不准纠集校外人员来闹事。严禁偷盗、敲诈等违法行为'
)
, t2(id, c1) as(
 SELECT a.id,b.c1 FROM 
 ( SELECT id,[value] = CONVERT(XML , '<v>' + REPLACE(c1 , CHAR(10) , '</v><v>') + '</v>') from t1) A
 OUTER APPLY 
 ( SELECT c1 = N.v.value('.' , 'varchar(4000)') FROM A.[value].nodes('/v') N ( v )) B
)
, t3(id, c1) as (
select * from t2 where c1 not like '%[文明]%'
)
select id,stuff(
(select CHAR(10) + convert(varchar(4000),c1) from t3 where id=A.id order by id for xml path('')
),1,1,'') as c1
from t3 A
group by id
zbdzjx 2017-08-08
  • 打赏
  • 举报
回复
with t1(id, c1) as(
Select '123',N'1、[守时]按时到校,不准迟到、早退和旷课
2、[夜晚]晚上就寝铃响后不准在校园内逗留
3、[骑车]骑自行车进出校门必须下车
4、[文明]不准在校园内追逐打闹,不得有说脏话、骂人、吵架等不文明行为
5、[打架]严禁打架斗殴,更不准纠集校外人员来闹事。严禁偷盗、敲诈等违法行为'
)
, t2(id, c1) as(
 SELECT a.id,b.c1 FROM 
 ( SELECT id,[value] = CONVERT(XML , '<v>' + REPLACE(c1 , CHAR(10) , '</v><v>') + '</v>') from t1) A
 OUTER APPLY 
 ( SELECT c1 = N.v.value('.' , 'varchar(100)') FROM A.[value].nodes('/v') N ( v )) B
)
, t3(id, c1) as (
select * from t2 where c1 not like '%[文明]%'
)
select id,stuff(
(select CHAR(10) + convert(varchar,c1) from t3 where id=A.id order by id for xml path('')
),1,1,'') as c1
from t3 A
group by id
  • 打赏
  • 举报
回复
这玩意正则一行解决,非得在sql里整。
吉普赛的歌 2017-08-07
  • 打赏
  • 举报
回复
USE tempdb
GO
---------------------------- 1. 测试表及测试数据 --------------------------------------
IF OBJECT_ID('test') IS NOT NULL DROP TABLE test
create table test (
id char(5) not null,
content varchar(2000) null,
constraint PK_TEST primary key (id)
)
INSERT INTO test(id,CONTENT)
SELECT 1,'1、[守时]按时到校
2、[夜晚]晚上就寝铃响
3、[骑车]骑自行车进出
4、[文明]不准在校园内
5、[打架]严禁打架斗殴' union all
SELECT 2,'1、[上车]123
2、[文明]不准在校园内追逐
3、[打架]xxx'

GO
---------------------------- 2. 增加按行分隔表值函数 -------------------------------------
IF OBJECT_ID('dbo.Fun_SplitByLine') IS NOT NULL
DROP FUNCTION dbo.Fun_SplitByLine
GO
-- =============================================
-- Author: yenange
-- Create date: 2017-04-26
-- Description: 按行分割表值函数
-- =============================================
CREATE FUNCTION dbo.Fun_SplitByLine
(
@str NVARCHAR(MAX)
)
RETURNS
@t TABLE
(
rowNum INT,
line NVARCHAR(MAX)
)
AS
BEGIN
DECLARE @i INT
SET @i=1

WHILE CHARINDEX(CHAR(10),@str)>0
BEGIN
INSERT INTO @t(rowNum,line)
SELECT @i,SUBSTRING(@str,1,CHARINDEX(char(10),@str))
SET @str = SUBSTRING(@str,CHARINDEX(char(10),@str)+1,LEN(@str))
SET @i = @i+1
END
IF LEN(@str)>0
BEGIN
INSERT INTO @t(rowNum,line) VALUES(@i,@str)
END

UPDATE @t SET line=REPLACE(REPLACE(line,char(13),''),CHAR(10),'')

RETURN
END
GO
---------------------------- 3. 输出结果 -------------------------------------
SELECT *,(
SELECT replace( STUFF(
(
SELECT ';'+fs.line
FROM test a CROSS APPLY dbo.fun_splitbyline(a.[content]) fs
WHERE
a.id=t.id
AND fs.line NOT LIKE '%文明%' for xml PATH('')
)
,1,1,''
),';','
')) AS result
FROM test t


最终的输出结果按需求, 删除了那一行带文明的, 其它内容还存在, 而且换行也没有变化。
二月十六 2017-08-07
  • 打赏
  • 举报
回复
引用 10 楼 z10843087 的回复:
[quote=引用 8 楼 sinat_28984567 的回复:] 没太看明白需求和表结构……不知道是不是这样:
--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([id] int,[content] nvarchar(56))
Insert #T
select 1,N'[守时]按时到校,不准迟到、早退和旷课' union all
select 2,N'[夜晚]晚上就寝铃响后不准在校园内逗留' union all
select 3,N'[骑车]骑自行车进出校门必须下车' union all
select 4,N'[文明]不准在校园内追逐打闹,不得有说脏话、骂人、吵架等不文明行为' union all
select 5,N'[打架]严禁打架斗殴,更不准纠集校外人员来闹事。严禁偷盗、敲诈等违法行为'
Go
--测试数据结束
UPDATE #T SET content = '文明' WHERE content LIKE '%文明%'
Select * from #T
他这个数据是在一行的。[/quote] 但看他的表结构和数据结构,感觉就是这样的似的,也不知道理解的对不对……
OwenZeng_DBA 2017-08-07
  • 打赏
  • 举报
回复
引用 8 楼 sinat_28984567 的回复:
没太看明白需求和表结构……不知道是不是这样:
--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([id] int,[content] nvarchar(56))
Insert #T
select 1,N'[守时]按时到校,不准迟到、早退和旷课' union all
select 2,N'[夜晚]晚上就寝铃响后不准在校园内逗留' union all
select 3,N'[骑车]骑自行车进出校门必须下车' union all
select 4,N'[文明]不准在校园内追逐打闹,不得有说脏话、骂人、吵架等不文明行为' union all
select 5,N'[打架]严禁打架斗殴,更不准纠集校外人员来闹事。严禁偷盗、敲诈等违法行为'
Go
--测试数据结束
UPDATE #T SET content = '文明' WHERE content LIKE '%文明%'
Select * from #T
他这个数据是在一行的。
听雨停了 2017-08-07
  • 打赏
  • 举报
回复
引用 6 楼 qq_37170555 的回复:
select context INTO Test_table from (SELECT '1.[守时]按时到校 2.[文明]不准在学校追逐打架 3.[骑车]骑车进学校必须下车 4.[文明]骑车进大苏打学校必须下车 5.[文明]骑车进啊大苏打撒旦学校必须下车 6.[干架]不能干死人' as context) as aa DECLARE @stuffstart INT, @stuffend INT, @no INT, @startNO VARCHAR(20), @startis VARCHAR(20) SET @startno = '1' WHILE CONVERT(INT, @startNO) <> 0 BEGIN SELECT @startNO = CHARINDEX('[文明]', context) FROM test_table --获取【文明】第一次出现的位置 --PRINT @startNO SET @startis = 1 SET @no = 2 WHILE ISNUMERIC(@startis) = 1 AND LEN(LTRIM(@startis)) = LEN(@startis) BEGIN SELECT @startis = SUBSTRING(context, @startNO -@no, @no -1) FROM Test_table SET @no = @no + 1 END --PRINT @startNO --PRINT @no SELECT @startis = SUBSTRING(context, @startNO -@no + 2, @no -3) FROM Test_table --PRINT @startis SELECT @stuffstart = @startNO -@no + 2 --PRINT @stuffstart SELECT @stuffend = CHARINDEX(CONVERT(VARCHAR(20), @startis + 1), context) FROM test_table --PRINT @stuffend IF CONVERT(INT, @startNO) <> 0 BEGIN UPDATE test_table SET context = STUFF(context, @stuffstart, @stuffend -@stuffstart, '') FROM Test_table END END SELECT * FROM Test_table
这样不行?
二月十六 2017-08-07
  • 打赏
  • 举报
回复
没太看明白需求和表结构……不知道是不是这样:
--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([id] int,[content] nvarchar(56))
Insert #T
select 1,N'[守时]按时到校,不准迟到、早退和旷课' union all
select 2,N'[夜晚]晚上就寝铃响后不准在校园内逗留' union all
select 3,N'[骑车]骑自行车进出校门必须下车' union all
select 4,N'[文明]不准在校园内追逐打闹,不得有说脏话、骂人、吵架等不文明行为' union all
select 5,N'[打架]严禁打架斗殴,更不准纠集校外人员来闹事。严禁偷盗、敲诈等违法行为'
Go
--测试数据结束
UPDATE #T SET content = '文明' WHERE content LIKE '%文明%'
Select * from #T
qq_28867275 2017-08-07
  • 打赏
  • 举报
回复
引用 5 楼 appetizing_fish1 的回复:



if not object_id(N'Tempdb..#Tmp_Data') is null
    drop table #Tmp_Data
Go
 
create table #Tmp_Data(id char(5), 
                        content nvarchar(2000),
						 constraint PK_TEST primary key (id))
go

INSERT INTO #Tmp_Data
Select '123',N'1、[守时]按时到校,不准迟到、早退和旷课
				2、[夜晚]晚上就寝铃响后不准在校园内逗留
				3、[骑车]骑自行车进出校门必须下车
				4、[文明]不准在校园内追逐打闹,不得有说脏话、骂人、吵架等不文明行为
				5、[打架]严禁打架斗殴,更不准纠集校外人员来闹事。严禁偷盗、敲诈等违法行为'

UPDATE #Tmp_Data SET Content=REPLACE(content,'文明','')

Select * From #Tmp_Data

不是说去掉文明这两个字,是这一行的内容,第4那一整行都不要。ok?明白?
听雨停了 2017-08-07
  • 打赏
  • 举报
回复
select context INTO Test_table from (SELECT '1.[守时]按时到校 2.[文明]不准在学校追逐打架 3.[骑车]骑车进学校必须下车 4.[文明]骑车进大苏打学校必须下车 5.[文明]骑车进啊大苏打撒旦学校必须下车 6.[干架]不能干死人' as context) as aa DECLARE @stuffstart INT, @stuffend INT, @no INT, @startNO VARCHAR(20), @startis VARCHAR(20) SET @startno = '1' WHILE CONVERT(INT, @startNO) <> 0 BEGIN SELECT @startNO = CHARINDEX('[文明]', context) FROM test_table --获取【文明】第一次出现的位置 --PRINT @startNO SET @startis = 1 SET @no = 2 WHILE ISNUMERIC(@startis) = 1 AND LEN(LTRIM(@startis)) = LEN(@startis) BEGIN SELECT @startis = SUBSTRING(context, @startNO -@no, @no -1) FROM Test_table SET @no = @no + 1 END --PRINT @startNO --PRINT @no SELECT @startis = SUBSTRING(context, @startNO -@no + 2, @no -3) FROM Test_table --PRINT @startis SELECT @stuffstart = @startNO -@no + 2 --PRINT @stuffstart SELECT @stuffend = CHARINDEX(CONVERT(VARCHAR(20), @startis + 1), context) FROM test_table --PRINT @stuffend IF CONVERT(INT, @startNO) <> 0 BEGIN UPDATE test_table SET context = STUFF(context, @stuffstart, @stuffend -@stuffstart, '') FROM Test_table END END SELECT * FROM Test_table
顺势而为1 2017-08-07
  • 打赏
  • 举报
回复



if not object_id(N'Tempdb..#Tmp_Data') is null
drop table #Tmp_Data
Go

create table #Tmp_Data(id char(5),
content nvarchar(2000),
constraint PK_TEST primary key (id))
go

INSERT INTO #Tmp_Data
Select '123',N'1、[守时]按时到校,不准迟到、早退和旷课
2、[夜晚]晚上就寝铃响后不准在校园内逗留
3、[骑车]骑自行车进出校门必须下车
4、[文明]不准在校园内追逐打闹,不得有说脏话、骂人、吵架等不文明行为
5、[打架]严禁打架斗殴,更不准纠集校外人员来闹事。严禁偷盗、敲诈等违法行为'

UPDATE #Tmp_Data SET Content=REPLACE(content,'文明','')

Select * From #Tmp_Data





qq_28867275 2017-08-07
  • 打赏
  • 举报
回复
引用 1 楼 z10843087 的回复:
[quote=引用 楼主 qq_28867275 的回复:] 如果用SQL去掉文明这行字符串如何实现?要求在不知道序号的情况下,序号和内容有所变化,就文明特定不变 解释:有可能下条数据 文明是第6条或者第3条,以【文明】开头,内容不太相同。 求各位数据库大神指点。谢谢! --------------------------------------------------------------------------------- create table test ( id char(5) not null, content varchar(2000) null, constraint PK_TEST primary key (id) ) ------------------------------------------------------------------------------- 1、[守时]按时到校,不准迟到、早退和旷课 2、[夜晚]晚上就寝铃响后不准在校园内逗留 3、[骑车]骑自行车进出校门必须下车 4、[文明]不准在校园内追逐打闹,不得有说脏话、骂人、吵架等不文明行为 5、[打架]严禁打架斗殴,更不准纠集校外人员来闹事。严禁偷盗、敲诈等违法行为 --------------------------------------------------------------------------------------------------------------------
你这个5条数据是房子一行还是多行的?[/quote] 就一条数据。
qq_28867275 2017-08-07
  • 打赏
  • 举报
回复
一条数据里面的。
顺势而为1 2017-08-07
  • 打赏
  • 举报
回复
直接用 Replace 替换 REPLACE(content,'文明','')
OwenZeng_DBA 2017-08-07
  • 打赏
  • 举报
回复
引用 楼主 qq_28867275 的回复:
如果用SQL去掉文明这行字符串如何实现?要求在不知道序号的情况下,序号和内容有所变化,就文明特定不变 解释:有可能下条数据 文明是第6条或者第3条,以【文明】开头,内容不太相同。 求各位数据库大神指点。谢谢! --------------------------------------------------------------------------------- create table test ( id char(5) not null, content varchar(2000) null, constraint PK_TEST primary key (id) ) ------------------------------------------------------------------------------- 1、[守时]按时到校,不准迟到、早退和旷课 2、[夜晚]晚上就寝铃响后不准在校园内逗留 3、[骑车]骑自行车进出校门必须下车 4、[文明]不准在校园内追逐打闹,不得有说脏话、骂人、吵架等不文明行为 5、[打架]严禁打架斗殴,更不准纠集校外人员来闹事。严禁偷盗、敲诈等违法行为 --------------------------------------------------------------------------------------------------------------------
你这个5条数据是房子一行还是多行的?

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧