拆分字符串并返回多列中的数据

时间:2011-03-04 10:07:48

标签: sql

首先感谢网站创建者,最重要的是帮助这个网站上的大师。

我在从字段中拆分字符串并在多列中显示它时遇到同样的问题示例我的表有三列 dbo.tests

Fname ID wTest                     Loc
ABC    1 "XYZ,PTO,LKMD,HGGFFD,"    R1
BCE    2 "PTO,XYZ,LKMD,,"          R1
LKJ    3 "XYZ"                     R3
JKL    4 "XYZ,PTO,LKMD,HGGFFD,PKL" R2

select语句的输出应显示如下数据:(根据wTest字符串所需的最大列动态生成列数,并使用null或某些值填充空columsn。

返回:

Fname ID Loc wTest wTest1 wTest2,wTest3,Wtest4...
ABC    1 R1  XYZ    PTO   LKMD   HGGFFD  Null
BCE    2 R1  PTO    XYZ   LKMD   Null    Null
LKJ    3 R3  XYZ    Null  Null   Null    Null                     
JKL    4 R2  XYZ    PTO   LKMD   HGGFFD  PKL

我遇到的两个关闭功能如下:

CREATE FUNCTION dbo.Split (@sep char(1), @s varchar(512)) 
RETURNS table AS RETURN 

(     
WITH Pieces (pn, start, stop) AS 
( 
SELECT 1, 1, CHARINDEX(@sep, @s)       
UNION ALL       
SELECT pn + 1, stop + 1, 
CHARINDEX(@sep, @s, stop + 1)       
FROM Pieces       
WHERE stop > 0     )     

SELECT pn, SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS s     FROM Pieces   )




with testTable AS 
(  SELECT 1 AS Id, N'how now brown cow' AS txt 
UNION ALL  
SELECT 2, N'she sells sea shells upon the sea shore' UNION ALL  
SELECT 3, N'red lorry yellow lorry' UNION ALL  
SELECT 4, N'the quick brown fox jumped over the lazy dog'  )    

SELECT display_term, COUNT(*) As Cnt   
FROM testTable  CROSS APPLY sys.dm_fts_parser('"' + txt + '"', 1033, 0,0)  
GROUP BY display_term  
HAVING COUNT(*) > 1  ORDER BY Cnt DESC  

对此方面的任何帮助表示高度赞赏。

...扎因 zainali2006@hotmail.co.uk

2 个答案:

答案 0 :(得分:0)

有人建议这样做,但我申请的目的有困难......

 Returns @Tbl_IDs 
    Table (Id int identity(1,1),
    Data Varchar(500)) As 
    Begin 
    --Remove the leading delimiter if any
    while (substring(@IDs,1,1) =@Delimiter)
    set @IDs = substring(@IDs, 2,len(@IDs)-1)

    -- Append comma
    --Set @IDs = @IDs + @Delimiter
    set @IDs = REPLACE(RTRIM(LTRIM(REPLACE(@IDs,@Delimiter,' '))),' ',@Delimiter)


    -- Indexes to keep the position of searching
    Declare @Pos1 Int
    Declare @pos2 Int
    Declare @RowNum Int

    -- Start from first character 
    Set @Pos1=1
    Set @Pos2=1
    While @Pos1>0
    Begin 
    Set @Pos1 = CharIndex(@Delimiter,@IDs,@Pos1)
    Insert @Tbl_IDs Values (Substring(@IDs,@Pos2,@Pos1-@Pos2))
    -- Go to next non comma character
    Set @Pos2=@Pos1+1
    -- Search from the next charcater
    Set @Pos1 = @Pos1+1
    End 
    Return
    End

答案 1 :(得分:0)

我遇到的另一个非常有趣和简单但不确定如何在我的select语句中使用:

DECLARE @NextString NVARCHAR(40)
DECLARE @Pos INT
DECLARE @NextPos INT
DECLARE @String NVARCHAR(40)
DECLARE @Delimiter NVARCHAR(40)

SET @String ='SQL,TUTORIALS,,TCF'
SET @Delimiter = ','
SET @String = @String + @Delimiter
SET @Pos = charindex(@Delimiter,@String)

WHILE (@pos <> 0)
BEGIN
SET @NextString = substring(@String,1,@Pos - 1)
SELECT @NextString -- Show Results
SET @String = substring(@String,@pos+1,len(@String))
SET @pos = charindex(@Delimiter,@String)
END