2013-06-03 46 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 
相关问题