2013-06-03 88 views
1

我只想知道如何使用字符串分隔符列中的select來選擇值。使用字符串分隔符從列中獲取值

例: 列的值是:

';#10;~Banana;#101;~Apple' 

如何才能得到這些值,並保存在像這樣的表?

code description 
    10  Banana 
    101 Apple 

似乎無法得到它使用子字符串,charindex組合。我應該用功能嗎? 基本上,這個列有潛力存儲100 +值(code/desc)。

+1

是存儲這樣的數據?或者這是從文本文件導入? – gbn

+0

這是SQL Server還是Sybase? – Pondlife

+0

是的,數據存儲在SQL Server表中的給定示例值的列中 – jackCaller

回答

2

試試這個使用XML節點法(SQL-FIDDEL

DECLARE @S VARCHAR(500)= ';#10;~Banana;#101;~Apple' 

--REMOVE LEADING ROW DELIMETER `;#` 
SELECT @S = SUBSTRING(@S,3, LEN(@S)) 


DECLARE @X XML 
SELECT @X = '<myxml><nodes><n1>' + 
REPLACE(REPLACE (@S,';#','</n2></nodes><nodes><n1>'),';~','</n1><n2>') + 
'</n2></nodes></myxml>' 


SELECT C.value('n1[1]','VARCHAR(50)') AS code, 
     C.value('n2[1]','VARCHAR(50)') AS description 
FROM @X.nodes('/myxml/nodes') Cols (C) 


| CODE | DESCRIPTION | 
---------------------- 
| 10 |  Banana | 
| 101 |  Apple | 
+0

不錯的一個...這正是我需要的。非常感謝Kaf! :) – jackCaller

+0

嗨卡夫,不知道是否可以發佈另一個問題......但有一種情況下,我只需要返回描述只在一行用逗號分隔,','。這可能嗎? TIA :) – jackCaller

+0

我想你可以使用UDF來做到這一點。將字符串列傳遞給該函數並返回過濾後的csv描述列表。你可以使用內置的字符串函數,如'Charindex','Substring'和'left/right'來實現。 – Kaf

0

你可以試試上面的(而不是 '' 使用 ';'):

CREATE FUNCTION dbo.fnSplit(
    @sInputList VARCHAR(8000) -- List of delimited items 
    , @sDelimiter VARCHAR(8000) = ',' -- delimiter that separates items 
) RETURNS @List TABLE (item VARCHAR(8000)) 

BEGIN 
DECLARE @sItem VARCHAR(8000) 
WHILE CHARINDEX(@sDelimiter,@sInputList,0) <> 0 
BEGIN 
SELECT 
    @sItem=RTRIM(LTRIM(SUBSTRING(@sInputList,1,CHARINDEX(@sDelimiter,@sInputList,0)-1))), 
    @sInputList=RTRIM(LTRIM(SUBSTRING(@sInputList,CHARINDEX(@sDelimiter,@sInputList,0)+LEN(@sDelimiter),LEN(@sInputList)))) 

IF LEN(@sItem) > 0 
    INSERT INTO @List SELECT @sItem 
END 

IF LEN(@sInputList) > 0 
INSERT INTO @List SELECT @sInputList -- Put the last item in 
RETURN 
END 
GO 



select * from dbo.fnSplit('1,22,333,444,,5555,666', ',') 

Results 

Item 

1 
22 
333 
444 
5555 
666 
+0

僅鏈接答案不是很好的答案。如果鏈接消失,答案變得毫無用處。請在實際答案中總結頁面的主要部分。 – ChrisF

+0

你是對的。我會修好它。 –

0

或簡單的字符串由';'

select 
    substr(column, INSTR(column, ';', 1, 1)+1, 
    (INSTR(column, ';', 1, 2) - INSTR(column, 1, 1)) 
    ) col_a, 
    substr(column, INSTR(column, ';', 1, 2)+1, 
    (INSTR(column, ';', 1, 3) - INSTR(column, ';', 1, 2)) 
    ) col_b 
from dual 

工作例如:

select 
    substr(';#10;~Banana;#101;~Apple', INSTR(';#10;~Banana;#101;~Apple', ';', 1, 1)+1, 
    (INSTR(';#10;~Banana;#101;~Apple', ';', 1, 2) - INSTR(';#10;~Banana;#101;~Apple', ';', 1, 1)) 
    ) col_a, 
    substr(';#10;~Banana;#101;~Apple', INSTR(';#10;~Banana;#101;~Apple', ';', 1, 2)+1, 
    (INSTR(';#10;~Banana;#101;~Apple', ';', 1, 3) - INSTR(';#10;~Banana;#101;~Apple', ';', 1, 2)) 
    ) col_b 
from dual 
相關問題