使用relace()函数模糊替换问题,高手请进

zsmz 2006-03-10 03:00:17
TABLE(id , content)
比如有条记录的content字段的内容为‘A01B02C03#A02B12C05#A02B10C03’
我现在要想达到的效果是找出content字段中两个#中间的这部分有like'%A02%'的数据,并且做删除操作。

比如要找的是A02
那处理之后结果是A01B02C03(因为A02B12C05和A02B10C03都含有A02,所以删除)

如果是C03
那处理之后结果是A02B12C05

请问这能够通过REPLACE函数获得吗?
...全文
257 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
liusujian02 2006-03-10
  • 打赏
  • 举报
回复
标记一下!!
lzhs 2006-03-10
  • 打赏
  • 举报
回复
定长的话,就好写多了,像这样:
Declare @T Table(str1 char(29))
Insert Into @T Values('A01B02C03#A02B12C05#A02B10C03')
Declare @Str char(3)
Set @Str = 'C03'

Select
Case When CharIndex(@Str,SubString(str1,1,9)) > 0 Then '' Else SubString(str1,1,9) End
+
Case When CharIndex(@Str,SubString(str1,11,9)) > 0 Then '' Else '#'+SubString(str1,11,9) End
+
Case When CharIndex(@Str,SubString(str1,21,9)) > 0 Then '' Else '#'+SubString(str1,21,9) End
From @T
不过这个处理后的结果会有一个小问题,就是最前面可能会多一个"#",还要再进一步处理一下!
zsmz 2006-03-10
  • 打赏
  • 举报
回复
如果是定长,有没有简单一点的解决方法?
lovecat_sc 2006-03-10
  • 打赏
  • 举报
回复
"子陌红尘"已经解决了这个问题,LZ给分吧!
-狙击手- 2006-03-10
  • 打赏
  • 举报
回复
分隔的三部分要是定长,还是可以处理的
zbxubing 2006-03-10
  • 打赏
  • 举报
回复
STUFF
删除指定长度的字符并在指定的起始点插入另一组字符。

语法
STUFF ( character_expression , start , length , character_expression )

参数
character_expression

由字符数据组成的表达式。character_expression 可以是常量、变量,也可以是字符或二进制数据的列。

start

是一个整形值,指定删除和插入的开始位置。如果 start 或 length 是负数,则返回空字符串。如果 start 比第一个 character_expression 长,则返回空字符串。

length

是一个整数,指定要删除的字符数。如果 length 比第一个 character_expression 长,则最多删除到最后一个 character_expression 中的最后一个字符。

返回类型
如果 character_expression 是一个支持的字符数据类型,则返回字符数据。如果 character_expression 是一个支持的 binary 数据类型,则返回二进制数据。

注释
可以嵌套字符串函数。

示例
下例通过在第一个字符串 (abcdef) 中删除从第二个位置(字符 b)开始的三个字符,然后在删除的起始位置插入第二个字符串,创建并返回一个字符串。

SELECT STUFF('abcdef', 2, 3, 'ijklmn')
GO

下面是结果集:

---------
aijklmnef

(1 row(s) affected)
zbxubing 2006-03-10
  • 打赏
  • 举报
回复
SUBSTRING
返回字符、binary、text 或 image 表达式的一部分。有关可与该函数一起使用的有效 Microsoft® SQL Server™ 数据类型的更多信息,请参见数据类型。

语法
SUBSTRING ( expression , start , length )

参数
expression

是字符串、二进制字符串、text、image、列或包含列的表达式。不要使用包含聚合函数的表达式。

start

是一个整数,指定子串的开始位置。

length

是一个正整数,指定将返回 expression 的字符数或字节数。如果 length 为负数,则会返回错误。



说明 由于在 text 数据上使用 SUBSTRING 时 start 和 length 指定字节数,因此 DBCS 数据(如日本汉字)可能导致在结果的开始或结束位置拆分字符。此行为与 READTEXT 处理 DBCS 的方式一致。然而,由于偶而会出现奇怪的结果,建议对 DBCS 字符使用 ntext 而非 text。


返回类型
如果 expression 是支持的字符数据类型,则返回字符数据。如果 expression 是支持的 binary 数据类型,则返回二进制数据。

返回字符串的类型与给定表达式的类型相同(表中显示的除外)。

给定的表达式 返回类型
text varchar
image varbinary
ntext nvarchar


注释
在字符数中必须指定使用 ntext、char 或 varchar 数据类型的偏移量(start 和 length)。在字节数中必须指定使用 text、image、binary 或 varbinary 数据类型的偏移量。



说明 兼容级别可能影响返回值。有关兼容级别的更多信息,请参见 sp_dbcmptlevel。


示例
A. 在字符串上使用 SUBSTRING
下例显示如何只返回字符串的一部分。该查询在一列中返回 authors 表中的姓氏,在另一列中返回 authors 表中的名字首字母。

USE pubs
SELECT au_lname, SUBSTRING(au_fname, 1, 1)
FROM authors
ORDER BY au_lname

下面是结果集:

au_lname
---------------------------------------- -
Bennet A
Blotchet-Halls R
Carson C
DeFrance M
del Castillo I
...
Yokomoto A

(23 row(s) affected)

下例显示如何显示字符串常量 abcdef 中的第二个、第三个和第四个字符。

SELECT x = SUBSTRING('abcdef', 2, 3)

下面是结果集:

x
----------
bcd

(1 row(s) affected)

B. 在 text、ntext 和 image 数据上使用 SUBSTRING
下例显示如何从 pubs 数据库的 publishers 表内的每个 text 和 image 数据列中返回前 200 个字符。text 数据以 varchar 的形式返回,image 数据则以 varbinary 的形式返回。

USE pubs
SELECT pub_id, SUBSTRING(logo, 1, 10) AS logo,
SUBSTRING(pr_info, 1, 10) AS pr_info
FROM pub_info
WHERE pub_id = '1756'

下面是结果集:

pub_id logo pr_info
------ ---------------------- ----------
1756 0x474946383961E3002500 This is sa

(1 row(s) affected)

下例显示 SUBSTRING 在 text 和 ntext 数据上的效果。首先,下例在 pubs 数据库内创建一个名为 npr_info 的新表。然后,在 npr_info 表中用 pub_info.pr_info 列的前 80 个字符创建 pr_info 列,并添加ü作为首字符。最后,INNER JOIN 检索所有出版商标识号以及 text 和 ntext 出版商信息列的 SUBSTRING。

IF EXISTS (SELECT table_name FROM INFORMATION_SCHEMA.TABLES
WHERE table_name = 'npub_info')
DROP TABLE npub_info
GO
-- Create npub_info table in pubs database. Borrowed from instpubs.sql.
USE pubs
GO
CREATE TABLE npub_info
(
pub_id char(4) NOT NULL
REFERENCES publishers(pub_id)
CONSTRAINT UPKCL_npubinfo PRIMARY KEY CLUSTERED,
pr_info ntext NULL
)

GO

-- Fill the pr_info column in npub_info with international data.
RAISERROR('Now at the inserts to pub_info...',0,1)

GO

INSERT npub_info VALUES('0736', N'üThis is sample text data for New Moon Books, publisher 0736 in the pubs database')
INSERT npub_info values('0877', N'üThis is sample text data for Binnet & Hardley, publisher 0877 in the pubs databa')
INSERT npub_info values('1389', N'üThis is sample text data for Algodata Infosystems, publisher 1389 in the pubs da')
INSERT npub_info values('9952', N'üThis is sample text data for Scootney Books, publisher 9952 in the pubs database')
INSERT npub_info values('1622', N'üThis is sample text data for Five Lakes Publishing, publisher 1622 in the pubs d')
INSERT npub_info values('1756', N'üThis is sample text data for Ramona Publishers, publisher 1756 in the pubs datab')
INSERT npub_info values('9901', N'üThis is sample text data for GGG&G, publisher 9901 in the pubs database. GGG&G i')
INSERT npub_info values('9999', N'üThis is sample text data for Lucerne Publishing, publisher 9999 in the pubs data')
GO
-- Join between npub_info and pub_info on pub_id.
SELECT pr.pub_id, SUBSTRING(pr.pr_info, 1, 35) AS pr_info,
SUBSTRING(npr.pr_info, 1, 35) AS npr_info
FROM pub_info pr INNER JOIN npub_info npr
ON pr.pub_id = npr.pub_id
ORDER BY pr.pub_id ASC
子陌红尘 2006-03-10
  • 打赏
  • 举报
回复
单纯的使用replace()函数无法实现楼主的需求,如果数据格式固定为两个'#'分隔的三部分,可以考虑使用字符串处理函数stuff(),substring()等组合起来处理,但是代码很烦琐,不如使用自定义函数处理起来直观,而且自定义函数处理的灵活性更大一些。
子陌红尘 2006-03-10
  • 打赏
  • 举报
回复

create function f_str(@content varchar(1000))
returns varchar(1000)
as
begin
declare @ret varchar(1000)
set @ret=''

while charindex('#',@content)>0
begin
if charindex('A02',left(@content,charindex('#',@content)-1))=0
set @ret=@ret+'#'+left(@content,charindex('#',@content)-1)
set @content=stuff(@content,1,charindex('#',@content),'')
end

if charindex('A02',@content)=0
set @ret=@ret+'#'+@content

if len(@ret)>0
set @ret=stuff(@ret,1,1,'')

return @ret
end
go

declare @t table(id int,content varchar(1000))
insert into @t select 1,'A01B02C03#A02B12C05#A02B10C03'
select content=dbo.f_str(content) from @t

/*
content
----------------
A01B02C03
*/

drop function f_str

22,210

社区成员

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

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