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的答案。