我有一個列transactionID
,其數據格式如下:3368/00392224/000/00
。使用SQL Server字符串函數來提取值
我必須在此列中提取數據到四列,如:
Column name Data
A 3368
B 00392224
C 000
D 00
我要做到這一點使用SQL Server字符串函數提取具有良好的效率值。誰能幫我嗎?
我有一個列transactionID
,其數據格式如下:3368/00392224/000/00
。使用SQL Server字符串函數來提取值
我必須在此列中提取數據到四列,如:
Column name Data
A 3368
B 00392224
C 000
D 00
我要做到這一點使用SQL Server字符串函數提取具有良好的效率值。誰能幫我嗎?
假設你正在使用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字符串拆分功能顯着提高速度。
使用以下代碼來獲得希望的結果
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(℃)
對於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。一個狡猾和鬼祟的解決方案。 –
你也有一個MySQL的標籤。同一個關係數據庫的源表和目標表都是? –
你一次只處理一行嗎?兩排應該怎麼看? –
另外,你可以請一個平臺嗎?你不可能得到一個適用於MySQL和SQL Server的單一答案。 –