我有一个列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的单一答案。 –