从SQL Server中特定于字符串的值进行解析
我有一个包含很长字符串的列,我需要能够从字符串中解析出特定的值(即状态名称的值67-70)。下面是我正在使用的(长)字符串。我假设我可以使用Parsename函数,但我不确定语法从SQL Server中特定于字符串的值进行解析,sql,sql-server,sql-server-2008,parsing,Sql,Sql Server,Sql Server 2008,Parsing,我有一个包含很长字符串的列,我需要能够从字符串中解析出特定的值(即状态名称的值67-70)。下面是我正在使用的(长)字符串。我假设我可以使用Parsename函数,但我不确定语法 H0100343107000100000000000151750A P+++++++++++++++++1016 STANLEY YOUNG 17 SPRAYPOINT DRIVE POINT COOK
H0100343107000100000000000151750A P+++++++++++++++++1016 STANLEY YOUNG 17 SPRAYPOINT DRIVE POINT COOK FO000006140949525A N WEB SITE S 3030 00010VICTORIA 61409495255
您应该使用子字符串
SELECT SUBSTRING('w3resource',4,3);
将输出eso
4,3表示从第4位开始,直到下一个3个字符
因此,在你的情况下,它将是
SELECT SUBSTRING(column_name,67,4);
这都是关于MYSQL的,但MS SQL具有相同的功能
SUBSTRING( string, start_position, length )
请检查此链接
您应该使用子字符串
SELECT SUBSTRING('w3resource',4,3);
将输出eso
4,3表示从第4位开始,直到下一个3个字符
因此,在你的情况下,它将是
SELECT SUBSTRING(column_name,67,4);
这都是关于MYSQL的,但MS SQL具有相同的功能
SUBSTRING( string, start_position, length )
请检查此链接
如果要从字符串中提取内容,t-sql中有两种解决方案(无CLR):
CREATE FUNCTION [dbo].[Split]
(
@Text VARCHAR(MAX),
@Delimiter VARCHAR(100),
@Index INT
)
RETURNS VARCHAR(MAX)
AS BEGIN
DECLARE @A TABLE (ID INT IDENTITY, V VARCHAR(MAX));
DECLARE @R VARCHAR(MAX);
WITH CTE AS
(
SELECT 0 A, 1 B
UNION ALL
SELECT B, CONVERT(INT,CHARINDEX(@Delimiter, @Text, B) + LEN(@Delimiter))
FROM CTE
WHERE B > A
)
INSERT @A(V)
SELECT SUBSTRING(@Text,A,CASE WHEN B > LEN(@Delimiter) THEN B-A-LEN(@Delimiter) ELSE LEN(@Text) - A + 1 END) VALUE
FROM CTE WHERE A >0
SELECT @R
= V
FROM @A
WHERE ID = @Index + 1
RETURN @R
END
如果要从字符串中提取内容,t-sql中有两种解决方案(无CLR):
CREATE FUNCTION [dbo].[Split]
(
@Text VARCHAR(MAX),
@Delimiter VARCHAR(100),
@Index INT
)
RETURNS VARCHAR(MAX)
AS BEGIN
DECLARE @A TABLE (ID INT IDENTITY, V VARCHAR(MAX));
DECLARE @R VARCHAR(MAX);
WITH CTE AS
(
SELECT 0 A, 1 B
UNION ALL
SELECT B, CONVERT(INT,CHARINDEX(@Delimiter, @Text, B) + LEN(@Delimiter))
FROM CTE
WHERE B > A
)
INSERT @A(V)
SELECT SUBSTRING(@Text,A,CASE WHEN B > LEN(@Delimiter) THEN B-A-LEN(@Delimiter) ELSE LEN(@Text) - A + 1 END) VALUE
FROM CTE WHERE A >0
SELECT @R
= V
FROM @A
WHERE ID = @Index + 1
RETURN @R
END
今天的小贴士:将数据存储在单独的列中,而不是可怕的字符串中。你能扩展吗?你希望从中得到什么不幸的是,这不是我的要求。这是任务的一部分。相信我,我决不会用这样的字符串存储数据!今天的小贴士:将数据存储在单独的列中,而不是可怕的字符串中。你能扩展吗?你希望从中得到什么不幸的是,这不是我的要求。这是任务的一部分。相信我,我决不会用这样的字符串存储数据!我想长度是4,不是3-67,68,69。我想长度是4而不是3-67,68,69。70