2016-08-26 59 views
1

這裏使用分隔符是數據存儲在此列拆分列在SQL Server

'88922774 8785075 9417025' 

我試圖與' '分離器返回所有3個獨立的數字爲例行。在某些情況下也可能有第四列。

通常用於分割字符串,我會用下面的

PARSENAME(REPLACE([ColumnName], ' ', '.'), 1) 
PARSENAME(REPLACE([ColumnName], ' ', '.'), 2) 
PARSENAME(REPLACE([ColumnName], ' ', '.'), 3) 
PARSENAME(REPLACE([ColumnName], ' ', '.'), 4) 

然而,這不是爲這個特殊的表返回任何數據,我不明白這是爲什麼。因爲如果我執行例如下面我看到預期的結果:

Select 
    PARSENAME(REPLACE('A Test Name', ' ', '.'), 1), 
    PARSENAME(REPLACE('A Test Name', ' ', '.'), 2), 
    PARSENAME(REPLACE('A Test Name', ' ', '.'), 3) 

我一直在使用substring()而不是嘗試,但我只能從字符串返回第一個和第二個項目,但不是第三。

援助將不勝感激。

我的預期輸出是這樣的:rextester.com/ACFL85345

但是我實際上看到的是NULL值。我使用的是SQL Server 2005中

+4

不要存放這樣的數據,有每行一個值。 – jarlh

+0

它工作..檢查此.. http://rextester.com/ACFL85345 –

+0

是否有可能三個數字集之間的字符不是一個標準的「」?因爲你在做什麼看起來不錯。 – pmeyer

回答

1

如果有幫助,這裏是PARSENAME之前我使用的UDF()

Select * from [dbo].[udf-Str-Parse-Row]('88922774 8785075 9417025',' ') 

返回

Pos1  Pos2 Pos3 Pos4 Pos5 Pos6 Pos7 Pos8 Pos9 
88922774 8785075 9417025 NULL NULL NULL NULL NULL NULL 

的UDF

CREATE FUNCTION [dbo].[udf-Str-Parse-Row] (@String varchar(max),@Delimeter varchar(10)) 
--Usage: Select * from [dbo].[udf-Str-Parse-Row]('Dog,Cat,House,Car',',') 
--  Select * from [dbo].[udf-Str-Parse-Row]('John Cappelletti',' ') 
--  Select * from [dbo].[udf-Str-Parse-Row]('id26,id46|id658,id967','|') 

Returns Table 

As 

Return (
    SELECT Pos1 = xDim.value('/x[1]','varchar(250)') 
      ,Pos2 = xDim.value('/x[2]','varchar(250)') 
      ,Pos3 = xDim.value('/x[3]','varchar(250)') 
      ,Pos4 = xDim.value('/x[4]','varchar(250)') 
      ,Pos5 = xDim.value('/x[5]','varchar(250)') 
      ,Pos6 = xDim.value('/x[6]','varchar(250)') 
      ,Pos7 = xDim.value('/x[7]','varchar(250)') 
      ,Pos8 = xDim.value('/x[8]','varchar(250)') 
      ,Pos9 = xDim.value('/x[9]','varchar(250)') 
    FROM (Select Cast('<x>' + Replace(@String,@Delimeter,'</x><x>')+'</x>' as XML) as xDim) A 
) 
+0

嗨,約翰,我正在努力創造這個功能的語法有沒有在那裏的錯字? 「Msg 102,Level 15,State 1,Procedure udf-Str-Parse-Row,Line 20 'A'附近語法不正確。」 – user2976138

+0

@ user2976138:去掉'Return'中的左括號(',它會工作的。 – Arulkumar

+0

@ user2976138對不起,我沒有粘貼在最後的「)」。更新我的回答 –

1

使用CHARINDEX來查找你的分隔符的索引(這裏是''),並且在SUBSTRING函數的幫助下你可以在SQL Ser版本。

DECLARE @val VARCHAR(50)='88922774 8785075 9417025' 

select LEFT(@val, charindex(' ', @val) - 1), 
    SUBSTRING(@val, charindex(' ', @val)+1, len(@val) - CHARINDEX(' ', reverse(@val)) - charindex(' ', @val)), 
     REVERSE(LEFT(reverse(@val), charindex(' ', reverse(@val)) - 1)) 
+0

我可以通過這種方式獲得第一個和第二個項目,但目前無法獲得第三個 – user2976138

+0

使用更新後的腳本.. –

0

試試這個,

DECLARE @item VARCHAR(MAX) = '88922774 8785075 9417025' 

SELECT SUBSTRING(@item, 0, CHARINDEX(' ', @item)) AS col1 
    ,SUBSTRING(SUBSTRING(@item, CHARINDEX(' ', @item) + 1, LEN(@ITEM)), 0, CHARINDEX(' ', SUBSTRING(@item, CHARINDEX(' ', @item) + 1, LEN(@ITEM)))) AS col2 
    ,REVERSE(SUBSTRING(REVERSE(@ITEM), 0, CHARINDEX(' ', REVERSE(@ITEM)))) AS col3