使用SQL Server字符串函数提取值

时间:2013-07-23 05:07:05

标签: sql-server mysql sql-server-2008

我有一个列transactionID,其中包含以下格式的数据:3368/00392224/000/00

我必须将此列中的数据提取到四列,如:

Column name    Data
A   3368
B   00392224
C   000
D   00

我必须使用SQL Server字符串函数来实现这一点,以高效率地提取值。任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分: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 ;

这是SQL Fiddle

现在,表演完全是另一个话题。 SQL Server在字符串操作方面本身就很糟糕。您可以使用CLR String-Split函数来显着提高速度。

答案 1 :(得分: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

答案 2 :(得分:-2)

使用以下代码获取愿望结果

DECLARE @String varchar(max),   @Splitchar char(1),   @Xmlvalue xml

设置@String ='3368/00392224/000/00' 设置@Splitchar ='/'

SELECT @Xmlvalue = CONVERT(xml,'< root>< s>'+ REPLACE(@ String,@ Splitchar,'< / s>< s>')+'< / s>< ; / root>')

SELECT [Value] = T.c.value('。','varchar(20)') FROM @ Xmlvalue.nodes('/ root / s')T(c)

Query Result