2013-05-09 45 views
0

我有以下查詢爲我工作到現在。通過多個分隔符將varchar列拆分爲標記(詞)並將它們作爲記錄

with tmp(product_id , Token, product_name) as (
    select product_id, cast (LEFT(product_name, CHARINDEX(' ',product_name+' ')-1) as varchar(100)), 
     STUFF(product_name, 1, CHARINDEX(' ',product_name+' '), '') 
    from Products 
    union all 
    select product_id, cast (LEFT(product_name, CHARINDEX(' ',product_name+' ')-1) as varchar(100)), 
     STUFF(product_name, 1, CHARINDEX(' ',product_name+' '), '') 
    from tmp 
    where product_name > '' 
    ) 

    select product_id, Token from tmp 

這將產品名稱按空格分開並提供給我作爲記錄。

但是現在我需要將產品名稱不僅用空格分隔,而且用空格,連字符和逗號分隔。我無法弄清楚如何實現這一點。

任何形式的幫助總是讚賞。

編輯 - 舉例

如果產品表包含以下

product_id, product_name 
1, JVC-600.BLACK 
2, M cb-588 

然後,我需要

product_id, token 
1, JVC 
1, 600 
1, BLACK 
2, M 
2, cb 
2, 588 

的結果。

+0

你可以張貼一些樣品之前運行此數據和要求的輸出 – praveen 2013-05-09 06:44:57

+0

@parveen增加了一些我如何使用它的例子。 – Ankit 2013-05-09 06:51:08

回答

1

如果您有一個查詢適用於空格,則很容易修改其他字符空格,例如,

with Prod2 as (
    select *, product_name2 = replace(replace(product_name,'.',' '),'-',' ') 
    from products 
) 
,tmp(product_id , Token, product_name) as (
select product_id, cast (LEFT(product_name2, CHARINDEX(' ',product_name2+' ')-1) as varchar(100)), 
    STUFF(product_name2, 1, CHARINDEX(' ',product_name2+' '), '') 
from Prod2 
union all 
select product_id, cast (LEFT(product_name, CHARINDEX(' ',product_name+' ')-1) as varchar(100)), 
    STUFF(product_name, 1, CHARINDEX(' ',product_name+' '), '') 
from tmp 
where product_name > '' 
) 

select product_id, Token from tmp 
+0

@非常感謝您的先生,但我認爲在tmp CTE的Anchor查詢中應該是「從Prod2」而不是「從產品」。 – Ankit 2013-05-09 07:25:53

+0

絕對正確的Ankit。那麼發現 - 這解決了你的問題嗎? – RichardTheKiwi 2013-05-09 09:15:54

0

調用while循環動態和這裏dee_split傳爲@var列的值的代碼是一個用戶自定義函數,運行此查詢執行的功能dee_split之前,你需要做的是所有轉換什麼特殊字符爲單用替換功能,然後將它傳遞給分割功能

 DROP TABLE #temp; 
     Create table #temp 
     (
     product_id varchar(10), 
     product_name varchar(100) 
     ) 

     Insert into #temp 
     values 
     ('1','JVC-600.BLACK'), 
     ('2','M cb-588') 

    Select * from #temp 

     DECLARE @var VARCHAR(100) 
SET @var='JVC-600.BLACK' 

Select @var=Replace(Replace(Replace (@var,'-','|'),'.','|'),' ','|') 

    Select * from dee_split (@var,'|',null) 

功能dee_split運行上面的查詢

 CREATE FUNCTION dee_split 
    ( 
    @str varchar(max), 
    @spliter char(1), 
    @colspliter char(1) = null 
    ) 
    RETURNS @tname TABLE(item VARCHAR(1000),item1 VARCHAR(1000)) 
    AS 
    BEGIN 
    DECLARE @string XML 
    IF LEN(@str)=0 
    BEGIN 
     INSERT INTO @tname VALUES(null,null) 
     RETURN 
    END 
    if @colspliter is null 
    begin 
    IF CHARINDEX(@spliter,@str,0) <> 0 
    BEGIN 
     SELECT @string= CONVERT(XML,'<root1><node>'+REPLACE(@str,@spliter,'</node><node>')+'</node></root1>') 

     INSERT INTO @tname(item) 
     SELECT [Value]=T.c.value('.','varchar(20)') 
     FROM @string.nodes('/root1/node') T(c) 
    END 
    end 
    ELSE 
    BEGIN 
     IF @str IS NOT NULL 
     BEGIN 
     IF @colspliter IS NOT NULL 
     SELECT @string= CONVERT(XML,'<root1><r1><node>'+REPLACE(REPLACE(@str,@colspliter,'</node><node1>'),@spliter,'</node1></r1><r1><node>')+'</node1></r1></root1>') 
     INSERT INTO @tname 
     SELECT col.value('data(node[1])','varchar(16)') item, 
     col.value('data(node1[1])','varchar(9)') item1 
     FROM @string.nodes('root1/r1') AS tbl(col) 
     END 
    END 
    RETURN 
    END