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

标签 sql-server mysql sql-server-2008

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

我必须从此列中提取数据到四列中,例如:

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 ;

这是一个SQL Fiddle

现在,性能完全是另一个话题。 SQL Server 天生不擅长字符串操作。您可以使用 CLR 显着加快速度字符串拆分函数。

关于sql-server - 使用 SQL Server 字符串函数提取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17818269/

相关文章:

c# - 避免使用实体类内的方法定义进行查询时出现查询客户端评估错误

php - MySQL查询进度信息

php - OOP PHP 文件中的 HTML 代码

sql - 选择inner join多对一关系限制子表的结果数

sql - 我应该将 XML Blob 放入单独的表中吗?

sql - 匹配 SQL Server 列中的逗号分隔值

SQL Server 查询 : what is the meaning of 'N' preceding a string?

sql - 如何按数字顺序对字母数字 SQL Server NVARCHAR 列进行排序?

c# - 如果删除 .mdf,则在删除 LocalDb 数据库时找不到指定的文件

mysql - 在 SQL 中查找重复值对