SQL求助,一个字段的内容分成两个字段!
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL求助,一个字段的内容分成两个字段!相关的知识,希望对你有一定的参考价值。
现在我数据库里,商品的品名、规格是合并在一个字段里面的。字段名:品名规格 内容:商品名称10s*2板、品名100ml、商品名 5mg:5ml:2。 类似这样的品名规格。现在我想把这个字段分开,品名归品名,规格归规格。改成 品名归品名一个字段,规格归规格一个字段。
目录表有上万条记录,所以想问一下有木有命令可以把它分开。
另:分开后可能会因为第三个品名规格的格式,有残余的空格。分开后,想把多余空格去除。怎么写命令?
木有规则,什么样的都有。。。。
数据库是sql2000和sql2008都有
什么数据库也没说,sqlserver为例吧
你现在需要做几个工作
第一,新建一个字段,或者两个字段,用来存放,5 和 mg 一个数值,一个单位
第二,创建两个自定义函数
第一个,截取字符串中的字母
create function [dbo].[m_getstr](@maco varchar(100))
returns varchar(max)
as
begin
while patindex(\'%[^a-z]%\',@maco)>0
begin
set @maco=stuff(@maco,patindex(\'%[^a-z]%\',@maco),1,\'\')
end
return @maco
end
然后再创建一个,截图字符串中的数字
CREATE FUNCTION DBO.GET_NUMBER2(@S VARCHAR(100))
RETURNS VARCHAR(100)
AS
BEGIN
WHILE patindex(\'%[^0-9]%\',@S) > 0
BEGIN
set @s=stuff(@s,patindex(\'%[^0-9]%\',@s),1,\'\')
END
RETURN @S
END
但是这个可能会存在问题,就是如果你数字中如果带有小数点的话,可能会出现错误
然后你就运用函数,分别把数字和字母分别update到对应字段吧
追问有小数点的。,。。。而且没什么规律。。。上面我放了一张图
追答那可能没什么用了
上边这些可能对你的2008好使,对你的2000无效,2000里貌似不支持正则
你这个只能手动去调整了
商品名称10s*2板、品名100ml、商品名 5mg:5ml:2
select trim(' ' from substr(A,5,instr(A,'、')-5)) “商品名称",trim(' ' from substr(A,instr(A,'、')+3,instr(A,'、',2)-instr(A,'、')-3)) "品名", trim(' ' from substr(A,instr(A,'、',2)+4)) "商品名" from A
trim就可以去掉空格。
至于你的这些我只能想到怎么把商品名称拿出来,因为这部分过了后面都是数字,还算有规律可循,可是商品名,就是那个L149,H7.5什么的我想不出办法了。
至于拿出来的办法,可能要写过程了,如果你能下载一个t-sql的正则工具包那更好,如果不能,那么就将这个表付给一个游标,然后对这个游标的这个字段用instr查找每一个数字,0-9,然后把每一个数字的位置进行比较,最小的就是你要截取的位置,然后用substr截取就行了,这就是商品名称。 参考技术B 啥样的,最好截个图放上面追问
在上面的追问里。木有规则的
追答兄弟,你的数据处理不了,没有什么函数能将无规律的数据给拆出来,多找点人做成Excel后导入数据库吧
参考技术C 字段名:品名规格 命名规则有没有规律?追问在上面的追问里。木有规则的
追答看你的数据一点规律都没有,没有规则不能分。数据库有没有品名这个字段,或者用数字来分行吗?如 ABC8abc,分了后变成 ABC 和 8abc,字段没有规律只能先粗略分,再一个一个看看。
sql 把一个字段分成多个字段
a b c
1 aaa-bbb-bbb 23
2 vvv-nnnn 24
3 qqq-www-wwww 12
变成如下形式:
a b1 b2 b3 c
1 aaa bbb bbb 23
2 vvv nnnn 24
3 qqq www wwww 12
我要mssql版本的 别给我Mysql和Oracle的
mysql> select * from t_fengchujun;
+------+--------------------+------+
| a | b | c |
+------+--------------------+------+
| 1 | fsdf-fefw-few-fegh | d |
| 2 | fhtre-reh-eh-jeg | fd |
| 3 | hjre-heg-wfbc | d |
+------+--------------------+------+
3 rows in set (0.00 sec)
mysql> select a,
-> SUBSTRING_INDEX(concat(b,'----'),'-',1) as b1,
-> SUBSTRING_INDEX(SUBSTRING_INDEX(concat(b,'----'),'-',2),'-',-1) as b2,
-> SUBSTRING_INDEX(SUBSTRING_INDEX(concat(b,'----'),'-',3),'-',-1) as b3,
-> SUBSTRING_INDEX(SUBSTRING_INDEX(concat(b,'----'),'-',4),'-',-1) as b4,
-> c
-> from t_fengchujun;
+------+-------+------+------+------+------+
| a | b1 | b2 | b3 | b4 | c |
| 1 | fsdf | fefw | few | fegh | d |
| 2 | fhtre | reh | eh | jeg | fd |
| 3 | hjre | heg | wfbc | | d |
就是这种效果如何达到,上边是mysql的 希望能转换成mssql的
方法和详细的操作步骤如下:
1、第一步,新的PHP文件,见下图,转到下面的步骤。
2、第二步,执行完上面的操作之后,需要声明数组变量,见下图,转到下面的步骤。
3、第三步,执行完上面的操作之后,使用函数将阵列连接到带有连接字符的字符串,见下图,转到下面的步骤。
4、第四步,执行完上面的操作之后,输出连接的字符串,见下图,转到下面的步骤。
5、第五步,执行完上面的操作之后,预览的效果见下图,转到下面的步骤。
6、第六步,执行完上面的操作之后,使用“implode”函数将数组拼接成字符串,使用“?”进行连接,见下图。这样,就解决了这个问题了。
参考技术A举例:
原始SQL:
SELECTPROVINCE_CODE,
CITY_CODE,
ZONE_CODE
FROM CIV_P_CUST
原始结果:
拆分SQL:
SELECTsubstring(PROVINCE_CODE,1,patindex('%〓%',PROVINCE_CODE)-1) as PID,
substring(PROVINCE_CODE,patindex('%〓%',PROVINCE_CODE)+1,len(PROVINCE_CODE)) as PNAME,
substring(CITY_CODE,1,patindex('%〓%',CITY_CODE)-1) as CID,
substring(CITY_CODE,patindex('%〓%',CITY_CODE)+1,len(CITY_CODE)) as CNAME,
substring(ZONE_CODE,1,patindex('%〓%',ZONE_CODE)-1) as ZID,
substring(ZONE_CODE,patindex('%〓%',ZONE_CODE)+1,len(ZONE_CODE)) as ZNAME
FROM CIV_P_CUST
拆分结果:
参考技术B select a, dbo.split(b,'-',1) as b1, dbo.split(b,'-',2) as b2, dbo.split(b,'-',3) as b3, c from t_fengchujun在执行上面的语句前,需要先创建一个字符串函数代码如下,在查询分析器执行
create function dbo.split(
@srcstr varchar(4000),
@space varchar(50),
@showindex int
)returns varchar(4000)
begin
declare @pos1 int
declare @pos2 int
declare @index int
declare @return varchar(4000)
set @pos1 = 0
set @pos2 = 0
set @index = 0
set @srcstr = @srcstr + @space
while @index<@showindex
begin
set @pos1 = @pos2
set @pos2 = charindex(@space,@srcstr,@pos1+1)
if @pos2-@pos1-1>0
set @return = substring(@srcstr,@pos1+1,@pos2-@pos1-1)
else
begin
set @pos2 = len(@srcstr)
set @return = ''
end
set @index = @index + 1
end
return(@return)
end
go本回答被提问者采纳 参考技术C 我的思路是:
1、先判断b列中的最多的“-”,建表,同时将数据插入到新表;
2、用charindex判断后,每列去更新。 参考技术D 这个只用sql语句比较麻烦,由于不确定性存在,基本不可能完善解决,最好办法是结合程序来做
以上是关于SQL求助,一个字段的内容分成两个字段!的主要内容,如果未能解决你的问题,请参考以下文章