2014-02-14 108 views
31

我有一些數據,我想基於可能存在或不存在的分隔符進行拆分。基於分隔符的T-SQL拆分字符串

示例數據:

John/Smith 
Jane/Doe 
Steve 
Bob/Johnson 

我使用下面的代碼拆分此數據爲第一和最後一個名字:

SELECT SUBSTRING(myColumn, 1, CHARINDEX('/', myColumn)-1) AS FirstName, 
     SUBSTRING(myColumn, CHARINDEX('/', myColumn) + 1, 1000) AS LastName 
FROM MyTable 

的結果,我想:

FirstName---LastName 
John--------Smith 
Jane--------Doe 
Steve-------NULL 
Bob---------Johnson 

只要所有行都具有預期的分隔符,此代碼就可以正常工作,但當行不行時會出錯t:

"Invalid length parameter passed to the LEFT or SUBSTRING function." 

如何重新編寫此項以正常工作?

回答

42

可能這會幫助你。

SELECT SUBSTRING(myColumn, 1, CASE CHARINDEX('/', myColumn) 
      WHEN 0 
       THEN LEN(myColumn) 
      ELSE CHARINDEX('/', myColumn) - 1 
      END) AS FirstName 
    ,SUBSTRING(myColumn, CASE CHARINDEX('/', myColumn) 
      WHEN 0 
       THEN LEN(myColumn) + 1 
      ELSE CHARINDEX('/', myColumn) + 1 
      END, 1000) AS LastName 
FROM MyTable 
+0

正是我一直在尋找,謝謝! – Whatevo

+0

很棒!謝謝 – Mikel

4

嘗試過濾掉包含那些只喜歡用分隔符和工作管柱行:

SELECT SUBSTRING(myColumn, 1, CHARINDEX('/', myColumn)-1) AS FirstName, 
     SUBSTRING(myColumn, CHARINDEX('/', myColumn) + 1, 1000) AS LastName 
FROM MyTable 
WHERE CHARINDEX('/', myColumn) > 0 

或者

SELECT SUBSTRING(myColumn, 1, CHARINDEX('/', myColumn)-1) AS FirstName, 
     SUBSTRING(myColumn, CHARINDEX('/', myColumn) + 1, 1000) AS LastName 
FROM MyTable 
WHERE myColumn LIKE '%/%' 
4
 
SELECT CASE 
     WHEN CHARINDEX('/', myColumn, 0) = 0 
      THEN myColumn 
     ELSE LEFT(myColumn, CHARINDEX('/', myColumn, 0)-1) 
     END AS FirstName 
    ,CASE 
     WHEN CHARINDEX('/', myColumn, 0) = 0 
      THEN '' 
     ELSE RIGHT(myColumn, CHARINDEX('/', REVERSE(myColumn), 0)-1) 
     END AS LastName 
FROM MyTable 
5

對於那些尋找答案脫穎而出的SQL Server 2016使用String_Split功能

如:

DECLARE @tags NVARCHAR(400) = 'clothing,road,,touring,bike' 

SELECT value 
FROM STRING_SPLIT(@tags, ',') 
WHERE RTRIM(value) <> ''; 

參考:https://msdn.microsoft.com/en-nz/library/mt684588.aspx

+0

我不確定這是否會回答問題,也不像上面的CASE聲明方法那樣有用。 STRING_SPLIT函數將它變成一個已加入的表格。那麼如何獲得第一名「名」第二名「姓」?使用交叉應用將我的ds變換成多行。將String數據轉換爲表格是一種很好的方式。像OP一樣,我試圖將單個列轉換爲兩列。 STRING_SPLIT將其變成兩行,並且無法分辨哪一行是「第一」,「第二」,「第三」(除非超出)。但是這變得更加複雜。 – ripvlan