使用分隔符拆分列

时间:2014-07-02 11:29:17

标签: sql command extract

我尝试在列中提取值并对这些值进行分组。例如,我的表包含一个包含以下内容的列:

柱:

  • download_ 名称 _01-01-2000
  • upload_ 名称 _05-10-2013
  • upload_ thisisanothername _09-08-2011
  • download_ thisisanothername _11-11-2013
  • upload_ thisisthename _01-05-2008

所以我想提取名称(上面的斜体)并对此列进行分组,这意味着会有一行“name”,“thisisanothername”和一行“thisisthename”。名称背后的日期可能会有所不同,以及名称本身的长度。并且可能有一个前缀(如上面“列”中的“上传”或“下载”)。所以我不能使用例如SUBSTRING(Column,7,10),因为这会切断名称或者甚至不会提取名称的一部分(例如,如果前缀很长)。

那么在SQL Server中有没有办法只提取名称?我所知道的是,名称始终在前缀和日期之间。我不知道如何使用我的基本SQL知识来做到这一点。

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

sURESH bLOG

我认为这可以帮助您通过在sql server中编写自定义拆分功能来执行此操作。

CREATE FUNCTION dbo.Split(@String nvarchar(4000), @Delimiter char(1))
RETURNS @Results TABLE (Items nvarchar(4000))
AS
BEGIN
DECLARE @INDEX INT
DECLARE @SLICE nvarchar(4000)
-- HAVE TO SET TO 1 SO IT DOESNT EQUAL Z
--     ERO FIRST TIME IN LOOP
SELECT @INDEX = 1
WHILE @INDEX !=0
BEGIN
-- GET THE INDEX OF THE FIRST OCCURENCE OF THE SPLIT CHARACTER
SELECT @INDEX = CHARINDEX(@Delimiter,@STRING)
-- NOW PUSH EVERYTHING TO THE LEFT OF IT INTO THE SLICE VARIABLE
IF @INDEX !=0
SELECT @SLICE = LEFT(@STRING,@INDEX - 1)
ELSE
SELECT @SLICE = @STRING
-- PUT THE ITEM INTO THE RESULTS SET
INSERT INTO @Results(Items) VALUES(@SLICE)
-- CHOP THE ITEM REMOVED OFF THE MAIN STRING
SELECT @STRING = RIGHT(@STRING,LEN(@STRING) - @INDEX)
-- BREAK OUT IF WE ARE DONE
IF LEN(@STRING) = 0 BREAK
END
RETURN

<强>查询

SELECT items FROM [dbo].[Split] ('861,739,10,1670', ',') 

答案 1 :(得分:0)

我假设日期的长度总是10

create table t1 ( col varchar(100) )

insert into t1 values ('download_name_01-01-2000')
insert into t1 values ('upload_name_05-10-2013')
insert into t1 values ('upload_thisisanothername_09-08-2011')
insert into t1 values ('download_thisisanothername_11-11-2013')


SELECT substring(col, charindex('_', col)+1, len(col) - (charindex('_', col) + 1) - 10)
FROM t1