2013-07-23 30 views
0

我有一個列transactionID,其數據格式如下:3368/00392224/000/00使用SQL Server字符串函數來提取值

我必須在此列中提取數據到四列,如:

Column name Data 
A 3368 
B 00392224 
C 000 
D 00 

我要做到這一點使用SQL Server字符串函數提取具有良好的效率值。誰能幫我嗎?

+0

你也有一個MySQL的標籤。同一個關係數據庫的源表和目標表都是? –

+0

你一次只處理一行嗎?兩排應該怎麼看? –

+1

另外,你可以請一個平臺嗎?你不可能得到一個適用於MySQL和SQL Server的單一答案。 –

回答

3

假設你正在使用SQL Server,你可以使用SUBSTRING(http://msdn.microsoft.com/en-us/library/ms187748.aspx)和CHARINDEX(http://msdn.microsoft.com/en-us/library/ms186323.aspx)的組合來實現這一點:

SELECT 
    CHARINDEX('/',MyColumn) AS P1, 
    CHARINDEX('/',MyColumn,CHARINDEX('/',MyColumn)+1) AS P2, 
    CHARINDEX('/',MyColumn,CHARINDEX('/',MyColumn,CHARINDEX('/',MyColumn)+1)+1) AS P3 
FROM MyTable; 

這會給你三個/字符的位置。 要拆分等領域使用:

SELECT 
    SUBSTRING(transactionId,1,P1-1) AS A, 
    SUBSTRING(transactionId,P1+1,P2-P1-1) AS B, 
    SUBSTRING(transactionId,P2+1,P3-P2-1) AS C, 
    SUBSTRING(transactionId,P3+1,LEN(transactionId)) AS D 
FROM(
SELECT 
    CHARINDEX('/',transactionId) AS P1, 
    CHARINDEX('/',transactionId,CHARINDEX('/',transactionId)+1) AS P2, 
    CHARINDEX('/',transactionId,CHARINDEX('/',transactionId,CHARINDEX('/',transactionId)+1)+1) AS P3, 
    transactionId 
FROM dbo.MyTable 
)X; 

最後,如果你是在2005年或更高版本,可以使用UNPIVOT(http://msdn.microsoft.com/en-us/library/ms177410(v=sql.105).aspx)的值分成多行:

SELECT U.* 
FROM (
SELECT 
    SUBSTRING(transactionId,1,P1-1) AS A, 
    SUBSTRING(transactionId,P1+1,P2-P1-1) AS B, 
    SUBSTRING(transactionId,P2+1,P3-P2-1) AS C, 
    SUBSTRING(transactionId,P3+1,LEN(transactionId)) AS D 
FROM(
SELECT 
    CHARINDEX('/',transactionId) AS P1, 
    CHARINDEX('/',transactionId,CHARINDEX('/',transactionId)+1) AS P2, 
    CHARINDEX('/',transactionId,CHARINDEX('/',transactionId,CHARINDEX('/',transactionId)+1)+1) AS P3, 
    transactionId 
FROM dbo.MyTable 
)X 
)Y 
UNPIVOT (Data for ColumnName IN(A,B,C,D))U ; 

這裏a SQL Fiddle

現在,性能是另一個話題。 SQL Server在字符串操作上本質上是不好的。您可以使用CLR字符串拆分功能顯着提高速度。

-2

使用以下代碼來獲得希望的結果

DECLARE @String VARCHAR(最大), @Splitchar炭(1), @XmlValue XML

組@String =「3368/00392224/000/00' 組@Splitchar = '/'

SELECT @XmlValue = CONVERT(XML, '<根> < S> '+ REPLACE(@字符串,@ Splitchar,' < /秒> < S>')+ '</s> </root>')

SELECT [值] = Tcvalue(」。 '' VARCHAR(20) ') FROM @ Xmlvalue.nodes('/根/ S')T(℃)

Query Result

3

對於SQL Server

假設你將永遠究竟有四個值,你可以使用一個偷偷摸摸招用PARSENAME - 如果你有好有其侷限性,它可以比更繁瑣的分析方法更笨重。

DECLARE @x TABLE(ID INT, transactionId VARCHAR(255)); 

INSERT @x VALUES(1, '000/334/1123232/3434'); 
INSERT @x VALUES(2, '343/224/114/32325665454'); 

;WITH x(ID, A,B,C,D) AS 
(
    SELECT ID, PARSENAME(t,4), PARSENAME(t,3), PARSENAME(t,2), PARSENAME(t,1) 
    FROM (SELECT ID, t = REPLACE(transactionId,'/','.') FROM @x) AS y 
) 
SELECT ID, [Column name], [Data] FROM x 
UNPIVOT ([Data] FOR [Column name] IN (A,B,C,D)) AS up; 

結果:

ID Column name Data 
-- ----------- ------------ 
1 A   000 
1 B   334 
1 C   1123232 
1 D   3434 
2 A   343 
2 B   224 
2 C   114 
2 D   32325665454 
+1

+1。一個狡猾和鬼祟的解決方案。 –

相關問題