帮忙改下SQL语句

时间:2021-02-17 21:57:38

 我有一张表(MSG_Inbox)接收短信内容的

id   Sender          MsgTitle
 1   13049653413          281005,1,18,9,3
 2   13049653413          281005,1,18
 3   13049653413          281005,1


 想显示成这样
   Sender  店号 进店状况 小品类1 小品类1 小品类2 小品类3 小品类4 小品类5
 


我的SQL语句是这样的
select id,Sender ,
店号 = parsename(replace(MsgTitle,',','.'), len(MsgTitle) - len(replace(MsgTitle,',',''))+1),
进店状况 = parsename(replace(MsgTitle,',','.'), len(MsgTitle) - len(replace(MsgTitle,',',''))),
小品类1 = parsename(replace(MsgTitle,',','.'), len(MsgTitle) - len(replace(MsgTitle,',',''))-1),

小品类1 = parsename(replace(MsgTitle,',','.'), len(MsgTitle) - len(replace(MsgTitle,',',''))-2),
小品类2 = parsename(replace(MsgTitle,',','.'), len(MsgTitle) - len(replace(MsgTitle,',',''))-3),
小品类3 = parsename(replace(MsgTitle,',','.'), len(MsgTitle) - len(replace(MsgTitle,',',''))-4),
小品类4 = parsename(replace(MsgTitle,',','.'), len(MsgTitle) - len(replace(MsgTitle,',',''))-5),
小品类5 = parsename(replace(MsgTitle,',','.'), len(MsgTitle) - len(replace(MsgTitle,',',''))-6)

from MSG_Inbox

现在我的结果为
id  Sender 店号 进店状况 小品类1 小品类1 小品类2 小品类3 小品类4 小品类5
1,  13049653413 NULL NULL NULL NULL NULL NULL NULL NULL
2,  13049653413 281005 1 18 NULL NULL NULL NULL NULL
3,  13049653413 281005 1 NULL NULL NULL NULL NULL NULL

第一条错误了  没有取到值 不知道什么原因  大家帮我看看!

12 个解决方案

#1


该回复于2010-07-28 09:07:07被版主删除

#2


parsename 只能针对4个,

#3


引用 2 楼 sql77 的回复:
parsename 只能针对4个,
<=4个

#4


引用 2 楼 sql77 的回复:
parsename 只能针对4个,



那要怎么改呢》?

#5


id   Sender             MsgTitle
 1   13049653413             281005,1,18,9,3
 2   13049653413             281005,1,18
 3   13049653413             281005,1

SELECT 
SUBSTRING(MsgTitle,1,CHARINDEX(',',MsgTitle)-1) AS 店号,
PARSENAME(REPLACE(STUFF(MsgTitle,1,CHARINDEX(',',MsgTitle),''),',',''),4),
PARSENAME(REPLACE(STUFF(MsgTitle,1,CHARINDEX(',',MsgTitle),''),',',''),3),
PARSENAME(REPLACE(STUFF(MsgTitle,1,CHARINDEX(',',MsgTitle),''),',',''),2),
PARSENAME(REPLACE(STUFF(MsgTitle,1,CHARINDEX(',',MsgTitle),''),',',''),1)
FROM TB

#6


引用 4 楼 shuihan16 的回复:
引用 2 楼 sql77 的回复:
parsename 只能针对4个,



那要怎么改呢》?

你先把第一个逗号前的取出去

#7


引用 6 楼 sql77 的回复:
引用 4 楼 shuihan16 的回复:
引用 2 楼 sql77 的回复:
parsename 只能针对4个,



那要怎么改呢》?

你先把第一个逗号前的取出去



但是我这里的,可能有9个哦 

#8


IF NOT OBJECT_ID('f_GetStr') IS NULL
DROP FUNCTION [f_GetStr]
GO

--分段截取函数(邹建)
CREATE FUNCTION dbo.f_GetStr(
@s varchar(8000),      --包含多个数据项的字符串
@pos int,             --要获取的数据项的位置
@split varchar(10)     --数据分隔符
)RETURNS varchar(100)
AS
BEGIN
IF @s IS NULL RETURN(NULL)
DECLARE @splitlen int
SELECT @splitlen=LEN(@split+'a')-2
WHILE @pos>1 AND CHARINDEX(@split,@s+@split)>0
SELECT @pos=@pos-1,
@s=STUFF(@s,1,CHARINDEX(@split,@s+@split)+@splitlen,'')
RETURN(ISNULL(LEFT(@s,CHARINDEX(@split,@s+@split)-1),''))
END
GO

--> 生成测试数据表: [tb]
IF OBJECT_ID('[tb]') IS NOT NULL
DROP TABLE [tb]
GO
CREATE TABLE [tb] ([id] [int],[Sender] [bigint],[MsgTitle] [nvarchar](20))
INSERT INTO [tb]
SELECT '1','13049653413','281005,1,18,9,3' UNION ALL
SELECT '2','13049653413','281005,1,18' UNION ALL
SELECT '3','13049653413','281005,1'

-->SQL查询如下:

SELECT id,Sender ,
店号 = dbo.f_GetStr(MsgTitle,1,','),
小品类1 = dbo.f_GetStr(MsgTitle,2,','),
小品类2 = dbo.f_GetStr(MsgTitle,3,','),
小品类3 = dbo.f_GetStr(MsgTitle,4,','),
小品类4 = dbo.f_GetStr(MsgTitle,5,',')
FROM [tb]
/*
id          Sender               店号         小品类1       小品类2       小品类3       小品类4
----------- -------------------- ---------- ---------- ---------- ---------- ----------
1           13049653413          281005     1          18         9          3
2           13049653413          281005     1          18                    
3           13049653413          281005     1                                

(3 行受影响)
*/

#9


引用 7 楼 shuihan16 的回复:
引用 6 楼 sql77 的回复:
引用 4 楼 shuihan16 的回复:
引用 2 楼 sql77 的回复:
parsename 只能针对4个,



那要怎么改呢》?

你先把第一个逗号前的取出去



但是我这里的,可能有9个哦

那你换别的函数吧,自己写的函数,SPLIT

#10


引用 5 楼 sql77 的回复:
SQL code
id   Sender             MsgTitle
 1   13049653413             281005,1,18,9,3
 2   13049653413             281005,1,18
 3   13049653413             281005,1

SELECT 
SUBSTRING(MsgTitle……



出来的结果为


id  Sender           店号 (无列名) (无列名) (无列名) (无列名)
1     13049653413 281005 NULL NULL NULL 11893
2     13049653413 281005 NULL NULL NULL 118
3     13049653413 281005 NULL NULL NULL 1

#11


Quote=引用 8 楼 htl258 的回复:]
SQL code
IF NOT OBJECT_ID('f_GetStr') IS NULL
    DROP FUNCTION [f_GetStr]
GO

--分段截取函数(邹建)
CREATE FUNCTION dbo.f_GetStr(
@s varchar(8000),      --包含多个数据项的字符串
@pos int,             --要获取的数据项的位……
[/Quote]


大哥谢谢你啊 很不错的
如果我现在有一张B表代表小品类的
如 id    name
   1     王老吉
   3     多加宝
   9      哇哈哈
  18     红牛


id          Sender         店号         小品类1       小品类2       小品类3       小品类4

1         13049653413       281005     王老吉          红牛      哇哈哈        多加宝2         13049653413       281005     王老吉          红牛                   
3         13049653413       281005     王老吉             



这个样子可以么?




#12



id          Sender         店号         小品类1       小品类2    小品类3   小品类4

1         13049653413       281005     王老吉          红牛      哇哈哈        多加宝2         13049653413       281005     王老吉          红牛                   
3         13049653413       281005     王老吉             






#1


该回复于2010-07-28 09:07:07被版主删除

#2


parsename 只能针对4个,

#3


引用 2 楼 sql77 的回复:
parsename 只能针对4个,
<=4个

#4


引用 2 楼 sql77 的回复:
parsename 只能针对4个,



那要怎么改呢》?

#5


id   Sender             MsgTitle
 1   13049653413             281005,1,18,9,3
 2   13049653413             281005,1,18
 3   13049653413             281005,1

SELECT 
SUBSTRING(MsgTitle,1,CHARINDEX(',',MsgTitle)-1) AS 店号,
PARSENAME(REPLACE(STUFF(MsgTitle,1,CHARINDEX(',',MsgTitle),''),',',''),4),
PARSENAME(REPLACE(STUFF(MsgTitle,1,CHARINDEX(',',MsgTitle),''),',',''),3),
PARSENAME(REPLACE(STUFF(MsgTitle,1,CHARINDEX(',',MsgTitle),''),',',''),2),
PARSENAME(REPLACE(STUFF(MsgTitle,1,CHARINDEX(',',MsgTitle),''),',',''),1)
FROM TB

#6


引用 4 楼 shuihan16 的回复:
引用 2 楼 sql77 的回复:
parsename 只能针对4个,



那要怎么改呢》?

你先把第一个逗号前的取出去

#7


引用 6 楼 sql77 的回复:
引用 4 楼 shuihan16 的回复:
引用 2 楼 sql77 的回复:
parsename 只能针对4个,



那要怎么改呢》?

你先把第一个逗号前的取出去



但是我这里的,可能有9个哦 

#8


IF NOT OBJECT_ID('f_GetStr') IS NULL
DROP FUNCTION [f_GetStr]
GO

--分段截取函数(邹建)
CREATE FUNCTION dbo.f_GetStr(
@s varchar(8000),      --包含多个数据项的字符串
@pos int,             --要获取的数据项的位置
@split varchar(10)     --数据分隔符
)RETURNS varchar(100)
AS
BEGIN
IF @s IS NULL RETURN(NULL)
DECLARE @splitlen int
SELECT @splitlen=LEN(@split+'a')-2
WHILE @pos>1 AND CHARINDEX(@split,@s+@split)>0
SELECT @pos=@pos-1,
@s=STUFF(@s,1,CHARINDEX(@split,@s+@split)+@splitlen,'')
RETURN(ISNULL(LEFT(@s,CHARINDEX(@split,@s+@split)-1),''))
END
GO

--> 生成测试数据表: [tb]
IF OBJECT_ID('[tb]') IS NOT NULL
DROP TABLE [tb]
GO
CREATE TABLE [tb] ([id] [int],[Sender] [bigint],[MsgTitle] [nvarchar](20))
INSERT INTO [tb]
SELECT '1','13049653413','281005,1,18,9,3' UNION ALL
SELECT '2','13049653413','281005,1,18' UNION ALL
SELECT '3','13049653413','281005,1'

-->SQL查询如下:

SELECT id,Sender ,
店号 = dbo.f_GetStr(MsgTitle,1,','),
小品类1 = dbo.f_GetStr(MsgTitle,2,','),
小品类2 = dbo.f_GetStr(MsgTitle,3,','),
小品类3 = dbo.f_GetStr(MsgTitle,4,','),
小品类4 = dbo.f_GetStr(MsgTitle,5,',')
FROM [tb]
/*
id          Sender               店号         小品类1       小品类2       小品类3       小品类4
----------- -------------------- ---------- ---------- ---------- ---------- ----------
1           13049653413          281005     1          18         9          3
2           13049653413          281005     1          18                    
3           13049653413          281005     1                                

(3 行受影响)
*/

#9


引用 7 楼 shuihan16 的回复:
引用 6 楼 sql77 的回复:
引用 4 楼 shuihan16 的回复:
引用 2 楼 sql77 的回复:
parsename 只能针对4个,



那要怎么改呢》?

你先把第一个逗号前的取出去



但是我这里的,可能有9个哦

那你换别的函数吧,自己写的函数,SPLIT

#10


引用 5 楼 sql77 的回复:
SQL code
id   Sender             MsgTitle
 1   13049653413             281005,1,18,9,3
 2   13049653413             281005,1,18
 3   13049653413             281005,1

SELECT 
SUBSTRING(MsgTitle……



出来的结果为


id  Sender           店号 (无列名) (无列名) (无列名) (无列名)
1     13049653413 281005 NULL NULL NULL 11893
2     13049653413 281005 NULL NULL NULL 118
3     13049653413 281005 NULL NULL NULL 1

#11


Quote=引用 8 楼 htl258 的回复:]
SQL code
IF NOT OBJECT_ID('f_GetStr') IS NULL
    DROP FUNCTION [f_GetStr]
GO

--分段截取函数(邹建)
CREATE FUNCTION dbo.f_GetStr(
@s varchar(8000),      --包含多个数据项的字符串
@pos int,             --要获取的数据项的位……
[/Quote]


大哥谢谢你啊 很不错的
如果我现在有一张B表代表小品类的
如 id    name
   1     王老吉
   3     多加宝
   9      哇哈哈
  18     红牛


id          Sender         店号         小品类1       小品类2       小品类3       小品类4

1         13049653413       281005     王老吉          红牛      哇哈哈        多加宝2         13049653413       281005     王老吉          红牛                   
3         13049653413       281005     王老吉             



这个样子可以么?




#12



id          Sender         店号         小品类1       小品类2    小品类3   小品类4

1         13049653413       281005     王老吉          红牛      哇哈哈        多加宝2         13049653413       281005     王老吉          红牛                   
3         13049653413       281005     王老吉