【探讨】寻求去除数据库字段中存放重复内容的最佳方法
2009-12-01 12:00
435 查看
最近项目中出现了一个BUG,找了很久才找到原因,是由于以前的“脏”数据造成的,具体“脏”数据类似下图所示:
以上图中有些行存放了重复的内容,如90133,90133和9007,90071,90072,90073,90074,90075,90076,9007中出现了重复的90133和9007,正确的存放应该是90133和9007,90071,90072,90073,90074,90075,90076。问题已经说明,现在需要做的就是解决问题了,如何得到正确的数据以及要求必须在数据库端来处理重复内容呢?如果哪位博友有更简捷的解决方法,欢迎提出指点。
以下是我的实现全过程:
实现思路为:在数据库端通过函数来处理重复的内容,先将字段内容分割进一个临时表,再select出不重复的内容,然后把select出的每一条记录内容组合成新的字符串,最后update该字段;
1、创建分割函数(将字段中的内容进行分割进一个临时表)
create Function [dbo].[split](@Sql varchar(8000),@Splits varchar(10))
returns @temp Table (a varchar(100))
As
Begin
Declare @i Int
Set @Sql = RTrim(LTrim(@Sql))
Set @i = CharIndex(@Splits,@Sql)
While @i >= 1
Begin
Insert @temp Values(Left(@Sql,@i-1))
Set @Sql = SubString(@Sql,@i+1,Len(@Sql)-@i)
Set @i = CharIndex(@Splits,@Sql)
End
If @Sql <> ''
Insert @temp Values (@Sql)
Return
End
2、创建组合字段新内容的函数(将临时表中select出的不重复的内容组合成一个新字符串)
CREATE FUNCTION [dbo].[Convert_ManageDeptCodes]
(
@ManageDeptCodes varchar(Max)
)
returns varchar(Max)
as
begin
declare @ConvertManageDeptCodes varchar(Max),@length int
set @ConvertManageDeptCodes ='';
set @length=0;
select
@ConvertManageDeptCodes = @ConvertManageDeptCodes+data+','
from
(
SELECT distinct a as Data from dbo.Split(@ManageDeptCodes,',')
)T
if(len(@ConvertManageDeptCodes)>0)
set @length=len(@ConvertManageDeptCodes)-1;
set @ConvertManageDeptCodes=Left(@ConvertManageDeptCodes,@length);
return @ConvertManageDeptCodes;
end
3、更新该字段的内容
update userinfo set ManageDeptCodes=dbo.Convert_ManageDeptCodes(ManageDeptCodes)
以上图中有些行存放了重复的内容,如90133,90133和9007,90071,90072,90073,90074,90075,90076,9007中出现了重复的90133和9007,正确的存放应该是90133和9007,90071,90072,90073,90074,90075,90076。问题已经说明,现在需要做的就是解决问题了,如何得到正确的数据以及要求必须在数据库端来处理重复内容呢?如果哪位博友有更简捷的解决方法,欢迎提出指点。
以下是我的实现全过程:
实现思路为:在数据库端通过函数来处理重复的内容,先将字段内容分割进一个临时表,再select出不重复的内容,然后把select出的每一条记录内容组合成新的字符串,最后update该字段;
1、创建分割函数(将字段中的内容进行分割进一个临时表)
create Function [dbo].[split](@Sql varchar(8000),@Splits varchar(10))
returns @temp Table (a varchar(100))
As
Begin
Declare @i Int
Set @Sql = RTrim(LTrim(@Sql))
Set @i = CharIndex(@Splits,@Sql)
While @i >= 1
Begin
Insert @temp Values(Left(@Sql,@i-1))
Set @Sql = SubString(@Sql,@i+1,Len(@Sql)-@i)
Set @i = CharIndex(@Splits,@Sql)
End
If @Sql <> ''
Insert @temp Values (@Sql)
Return
End
2、创建组合字段新内容的函数(将临时表中select出的不重复的内容组合成一个新字符串)
CREATE FUNCTION [dbo].[Convert_ManageDeptCodes]
(
@ManageDeptCodes varchar(Max)
)
returns varchar(Max)
as
begin
declare @ConvertManageDeptCodes varchar(Max),@length int
set @ConvertManageDeptCodes ='';
set @length=0;
select
@ConvertManageDeptCodes = @ConvertManageDeptCodes+data+','
from
(
SELECT distinct a as Data from dbo.Split(@ManageDeptCodes,',')
)T
if(len(@ConvertManageDeptCodes)>0)
set @length=len(@ConvertManageDeptCodes)-1;
set @ConvertManageDeptCodes=Left(@ConvertManageDeptCodes,@length);
return @ConvertManageDeptCodes;
end
3、更新该字段的内容
update userinfo set ManageDeptCodes=dbo.Convert_ManageDeptCodes(ManageDeptCodes)
相关文章推荐
- 【求助】寻求去除数据库字段中存放重复内容的最佳方法
- 【数据库 Oracle】--去除重复字段
- PHP中二维数组的排序、去除二维数组的重复、对二维数组的某一字段进行求和的方法
- 根据基础数据表id获取数据库中关联表字段内容方法
- 数据库查询记录中某些字段重复的方法
- 数据库中的内容字段被挂马的替换方法 SQL注入
- 数据库表中去除多个字段完全重复的数据,保留唯一
- 在mysql中关于通过多字段去除重复记录的方法
- mysql 中去除字段内容中指定内容的方法的方法
- perl去除重复内容的脚本代码(重复行+数组重复字段)
- 去除重复内容的方法(sql)
- MySQL 删除数据库中重复数据方法小结
- sqlalchemy 查询的时候排除掉数据库字段为 null的方法
- 数据库内容导出到EXCEL生成报表和图形的方法
- jQuery实现鼠标双击Table单元格变成文本框及输入内容后更新到数据库的方法
- 更新操作如何防止带外键的字段出现重复,代码实现方法
- 在JAVA中,把数据插入数据库字段类型为DATA方法
- Dynamics CRM EntityCollection 根据实体中的某个字段为依据去除重复数据