我只想知道如何使用字符串分隔符列中的select來選擇值。使用字符串分隔符從列中獲取值
例: 列的值是:
';#10;~Banana;#101;~Apple'
如何才能得到這些值,並保存在像這樣的表?
code description
10 Banana
101 Apple
似乎無法得到它使用子字符串,charindex組合。我應該用功能嗎? 基本上,這個列有潛力存儲100 +值(code/desc)。
我只想知道如何使用字符串分隔符列中的select來選擇值。使用字符串分隔符從列中獲取值
例: 列的值是:
';#10;~Banana;#101;~Apple'
如何才能得到這些值,並保存在像這樣的表?
code description
10 Banana
101 Apple
似乎無法得到它使用子字符串,charindex組合。我應該用功能嗎? 基本上,這個列有潛力存儲100 +值(code/desc)。
試試這個使用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 |
不錯的一個...這正是我需要的。非常感謝Kaf! :) – jackCaller
嗨卡夫,不知道是否可以發佈另一個問題......但有一種情況下,我只需要返回描述只在一行用逗號分隔,','。這可能嗎? TIA :) – jackCaller
我想你可以使用UDF來做到這一點。將字符串列傳遞給該函數並返回過濾後的csv描述列表。你可以使用內置的字符串函數,如'Charindex','Substring'和'left/right'來實現。 – Kaf
你可以試試上面的(而不是 '' 使用 ';'):
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
僅鏈接答案不是很好的答案。如果鏈接消失,答案變得毫無用處。請在實際答案中總結頁面的主要部分。 – ChrisF
你是對的。我會修好它。 –
或簡單的字符串由';'
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
是存儲這樣的數據?或者這是從文本文件導入? – gbn
這是SQL Server還是Sybase? – Pondlife
是的,數據存儲在SQL Server表中的給定示例值的列中 – jackCaller