2013-07-23 35 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。一个狡猾和鬼祟的解决方案。 –

相关问题