这是我们系统的一个截图,其中规格描述是材料的长宽高,中间用*号隔开的,但我们的资料建立人员在初期并未将材料的长宽高三栏分别输入,即基本资料的长度,宽度和高度均是零,现在系统运行了发现这三个数据均需要在后续运算中用到,如果手工修正确实很费时费力,但系统内的材料有近万笔,能否请大家指点一下,有没什么函数和语句,可以一次性将这个规格分解成三段并写入长宽高三个栏位中,规格描述与长宽高均在同一个table中,感谢大家的指点,我是刚接触Sqlserver的老陈,不胜感激。
如果直接用sqlserver,可以写个存储过程运行,利用string_split函数分割字段字符串。
如果会写程序,可以写一个小工具,想怎么整理数据库都行。
如果是sql server2000,没有stringsplit函数的,可以用以下方式创建一个自定义函数,
IF OBJECT_ID('DBO.GetSplitItem') IS NOT NULL
DROP FUNCTION DBO.GetSplitItem
go
create function [dbo].GetSplitItem(
@strIn as varchar(20),
@strSplit as varchar(20),
@getindex as int)
returns varchar(20)
as
begin
declare @starIndex as int;
declare @endIndex as int;
declare @strLen as int;
declare @strGet as varchar(20);
declare @curitem as int;
set @starIndex=1;
set @strIn=replace(@strIn,'mm','');
set @curitem=0;
set @endIndex=1;
while @endIndex>0
begin
set @endIndex=charindex(@strSplit,@strIn,@starIndex);
if @curitem=@getindex
begin
if @endIndex>0
set @strLen = @endIndex-@starIndex
else
set @strLen = len(@strSplit)+1
set @strGet=substring(@strIn,@starIndex,@strLen);
--select @strGet;
break
end
set @curitem=@curitem+1;
set @starIndex = @endIndex+1;
end
return @strGet
end
go
使用方法
select [dbo].GetSplitItem('10*20*30mm','*',0);
select [dbo].GetSplitItem('10*20*30mm','*',1);
select [dbo].GetSplitItem('10*20*30mm','*',2);
也可以用来更新字段
update 数据表 set 长度字段=[dbo].GetSplitItem(规格字段,'*',0),宽度字段=[dbo].GetSplitItem(规格字段,'*',1),高度字段=[dbo].GetSplitItem(规格字段,'*',2)
使用MySQL的SUBSTRING_INDEX()函数,可以将一个栏位的内容拆分成多个内容并写入相应的栏位中,例如:
UPDATE table_name SET col1 = SUBSTRING_INDEX(col2, '-', 1), col3 = SUBSTRING_INDEX(col2, '-', -1);
如果你使用 SQL Server,可以使用 SQL 语句将数据更新到需要的栏位中。下面是一个基本的示例:
UPDATE 表名
SET length = 子字符串1, width = 子字符串2, height = 子字符串3
FROM (
SELECT
ID,
SUBSTRING(规格描述, 1, CHARINDEX('*', 规格描述) - 1) AS 子字符串1,
SUBSTRING(规格描述, CHARINDEX('*', 规格描述) + 1, CHARINDEX('*', 规格描述, CHARINDEX('*', 规格描述) + 1) - CHARINDEX('*', 规格描述) - 1) AS 子字符串2,
SUBSTRING(规格描述, CHARINDEX('*', 规格描述, CHARINDEX('*', 规格描述) + 1) + 1, LEN(规格描述) - CHARINDEX('*', 规格描述, CHARINDEX('*', 规格描述) + 1)) AS 子字符串3
FROM 表名
) AS T
WHERE 表名.ID = T.ID
在这个语句中,表名需要替换为你的表名,规格描述需要替换为存储规格描述的栏位名称。
需要注意的是,上面的语句需要使用子查询,其中的SUBSTRING和CHARINDEX函数用于提取规格描述中的长度、宽度和高度。请根据实际情况调整语句以符合你的需求。