首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有字符索引问题的选择

带有字符索引问题的选择
EN

Stack Overflow用户
提问于 2018-05-10 14:20:49
回答 2查看 49关注 0票数 3

我试图使用'a‘分隔符将这个字符串分隔成不同的列。

代码语言:javascript
复制
005031812180200000100aRemaining Inside Terminala Cassette 1(BIN1)/c:HTG 21,000a Cassette 2(BIN2)/c:HTG 23,000a Cassette 3(BIN3)/d:HTG 47,000a Cassette 4(BIN4)/d:HTG 48,000a Total : HTG 139,000aaaad

我正在用以下代码创建一个对象:

代码语言:javascript
复制
CREATE FUNCTION dbo.splitstring ( @stringToSplit VARCHAR(MAX) )
RETURNS
 @returnList TABLE ([cassette_1] [nvarchar] (500),
                [cassette_2] [nvarchar] (500),
                [cassette_3] [nvarchar] (500),
                [cassette_4] [nvarchar] (500),
                [total] [nvarchar] (500)
               )
AS
BEGIN

 DECLARE @cassette_1 NVARCHAR(255)
 DECLARE @cassette_2 NVARCHAR(255)
 DECLARE @cassette_3 NVARCHAR(255)
 DECLARE @cassette_4 NVARCHAR(255)
 DECLARE @total NVARCHAR(255)
 DECLARE @pos INT

WHILE CHARINDEX('a ', @stringToSplit) > 0
 BEGIN
  SELECT @pos = CHARINDEX('a ', @stringToSplit)  
  SELECT @cassette_1 = SUBSTRING(@stringToSplit, 1, @pos-1)
  SELECT @cassette_2 = SUBSTRING(@stringToSplit, 1, @pos-1)
  SELECT @cassette_3 = SUBSTRING(@stringToSplit, 1, @pos-1)
  SELECT @cassette_4 = SUBSTRING(@stringToSplit, 1, @pos-1)
  SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+1, LEN(@stringToSplit)-@pos)
 END

INSERT INTO @returnList (cassette_1)
SELECT @cassette_1
INSERT INTO @returnList (cassette_2)
SELECT @cassette_2
INSERT INTO @returnList (cassette_3)
SELECT @cassette_2
INSERT INTO @returnList (cassette_4)
SELECT @cassette_4
INSERT INTO @returnList (total)
SELECT @stringToSplit

 RETURN
END    

这是我调用对象的代码:

代码语言:javascript
复制
SELECT * FROM dbo.splitstring('005031812180200000100aRemaining Inside Terminala Cassette 1(BIN1)/c:HTG 21,000a Cassette 2(BIN2)/c:HTG 23,000a Cassette 3(BIN3)/d:HTG 47,000a Cassette 4(BIN4)/d:HTG 48,000a Total : HTG 139,000aaaad')

该字符串将在表中调用字符串。

这就是现在取得的结果:http://sqlfiddle.com/#!18/60eb5/2

我需要一个注册表中的所有内容(我知道插入的是一个新的),但我似乎没有完成它,而且我只得到每一列的最后一部分(盒式4)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-10 15:11:59

在循环中,您将在每次迭代中设置所有@casette_n变量。要么将循环展开为四组语句,要么根据计数器获取正确的变量并将值赋值给它。我在下面的代码中选择了第一种可能性。

最后,INSERT可以用一个SELECT编写。因此,只插入一行。

在开始的时候,似乎有一个名字或什么的标题。你也得解决这个问题。我也添加了输出,但是如果你不想要,你可以放弃它。但是在搜索第一盘磁带之前,它必须从字符串中删除。

代码语言:javascript
复制
CREATE FUNCTION dbo.splitstring ( @stringToSplit VARCHAR(MAX) )
RETURNS
 @returnList TABLE ([name] [nvarchar] (500),
                    [cassette_1] [nvarchar] (500),
                    [cassette_2] [nvarchar] (500),
                    [cassette_3] [nvarchar] (500),
                    [cassette_4] [nvarchar] (500),
                    [total] [nvarchar] (500)
                   )
AS
BEGIN
 DECLARE @name NVARCHAR(255)
 DECLARE @cassette_1 NVARCHAR(255)
 DECLARE @cassette_2 NVARCHAR(255)
 DECLARE @cassette_3 NVARCHAR(255)
 DECLARE @cassette_4 NVARCHAR(255)
 DECLARE @total NVARCHAR(255)
 DECLARE @pos INT

 -- getting the name
 SELECT @pos = CHARINDEX('a ', @stringToSplit)
 SELECT @name = SUBSTRING(@stringToSplit, 1, @pos-1)
 SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+1, LEN(@stringToSplit)-@pos)

 -- getting 1st cassette
 SELECT @pos = CHARINDEX('a ', @stringToSplit)
 SELECT @cassette_1 = SUBSTRING(@stringToSplit, 1, @pos-1)
 SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+1, LEN(@stringToSplit)-@pos)

 -- getting 2nd cassette
 SELECT @pos = CHARINDEX('a ', @stringToSplit)
 SELECT @cassette_2 = SUBSTRING(@stringToSplit, 1, @pos-1)
 SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+1, LEN(@stringToSplit)-@pos)

 -- getting 3rd cassette
 SELECT @pos = CHARINDEX('a ', @stringToSplit)
 SELECT @cassette_3 = SUBSTRING(@stringToSplit, 1, @pos-1)
 SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+1, LEN(@stringToSplit)-@pos)

 -- getting 4th cassette
 SELECT @pos = CHARINDEX('a ', @stringToSplit)
 SELECT @cassette_4 = SUBSTRING(@stringToSplit, 1, @pos-1)
 SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+1, LEN(@stringToSplit)-@pos)

 -- inserting one row
 INSERT INTO @returnList (name, cassette_1, cassette_2, cassette_3, cassette_4, total)
 SELECT @name, @cassette_1, @cassette_2, @cassette_3, @cassette_4, @stringToSplit

 RETURN
END

但是,只有在有四个磁带的情况下,这才能奏效!对于任意数量的磁带,您可能需要重新考虑,如果这样的字符串也必须处理的话。

当然,如果一个'a '出现在数据中的某个地方,比如在名称标题中,'It's a wonderful day'说,你就完蛋了。

票数 0
EN

Stack Overflow用户

发布于 2018-05-10 14:34:06

你的功能就快到了..。但不是

代码语言:javascript
复制
INSERT INTO @returnList (cassette_1)
SELECT @cassette_1
INSERT INTO @returnList (cassette_2)
SELECT @cassette_2
INSERT INTO @returnList (cassette_3)
SELECT @cassette_2
INSERT INTO @returnList (cassette_4)
SELECT @cassette_4
INSERT INTO @returnList (total)
SELECT @stringToSplit

你可以用这个

代码语言:javascript
复制
INSERT INTO @returnList 
SELECT @cassette_1,@cassette_2,@cassette_3,@cassette_4,@stringToSplit

CMIIW,请告诉我这是否有帮助..。

谢谢

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50275123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档