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

Sql server 使用SQL Server字符串函数提取值,sql-server,mysql,sql-server-2008,Sql Server,Mysql,Sql Server 2008,我有一个列transactionID,其中包含以下格式的数据:3368/00392224/000/00 我必须将此列中的数据提取为四列,如下所示: Column name Data A 3368 B 00392224 C 000 D 00 我必须使用SQLServer字符串函数来实现这一点,以高效地提取值。有人能帮我吗?假设您使用的是SQL Server,您可以使用SUBSTRING()和CHARINDEX()的组合来实现这一点: SELECT CHARINDEX(

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

我必须将此列中的数据提取为四列,如下所示:

Column name    Data
A   3368
B   00392224
C   000
D   00

我必须使用SQLServer字符串函数来实现这一点,以高效地提取值。有人能帮我吗?

假设您使用的是SQL Server,您可以使用SUBSTRING()和CHARINDEX()的组合来实现这一点:

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()将值分隔为多行:

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 Server天生就不擅长字符串操作。通过使用字符串拆分函数,您可以显著加快速度。

假设您使用的是SQL Server,您可以使用SUBSTRING()和CHARINDEX()的组合来实现这一点:

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()将值分隔为多行:

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 Server天生就不擅长字符串操作。通过使用字符串拆分函数,可以显著加快速度。

使用下面的代码来获得所需的结果

声明@String varchar(max), @Splitchar(1), @xml值

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

选择@Xmlvalue=CONVERT(xml),+REPLACE(@String,@Splitchar,)+“”)

选择[Value]=T.c.Value('.','varchar(20)') 来自@Xmlvalue.nodes('/root/s')T(c)


使用下面的代码获得想要的结果

声明@String varchar(max), @Splitchar(1), @xml值

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

选择@Xmlvalue=CONVERT(xml),+REPLACE(@String,@Splitchar,)+“”)

选择[Value]=T.c.Value('.','varchar(20)') 来自@Xmlvalue.nodes('/root/s')T(c)


用于SQL Server的

假设你总是有四个值,你可以使用一个狡猾的技巧-如果你对它的局限性感到满意的话,它可以比更麻烦的解析方法简单得多

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

用于SQL Server

假设你总是有四个值,你可以使用一个狡猾的技巧-如果你对它的局限性感到满意的话,它可以比更麻烦的解析方法简单得多

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

您还有一个MySQL标记。您的源表和目标表是同一个RDBMS吗?您一次只处理一行吗?两排应该是什么样子?另外,你能选一个站台吗?您不太可能得到一个同时适用于MySQL和SQL Server的答案。您还有一个MySQL标记。您的源表和目标表是同一个RDBMS吗?您一次只处理一行吗?两排应该是什么样子?另外,你能选一个站台吗?您不太可能得到一个同时适用于MySQL和SQL Server的答案。