从SQL Server中特定于字符串的值进行解析

从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

我有一个包含很长字符串的列,我需要能够从字符串中解析出特定的值(即状态名称的值67-70)。下面是我正在使用的(长)字符串。我假设我可以使用Parsename函数,但我不确定语法

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):

  • 按位置
  • 使用分隔符拆分字符串
  • 1-position可以使用的字符串函数有:SUBSTRING、LEFT、RIGHT

    2-t-sql中没有基于分隔符拆分字符串的内置函数。您可以编写函数来拆分它。下面是一些拆分函数:

    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):

  • 按位置
  • 使用分隔符拆分字符串
  • 1-position可以使用的字符串函数有:SUBSTRING、LEFT、RIGHT

    2-t-sql中没有基于分隔符拆分字符串的内置函数。您可以编写函数来拆分它。下面是一些拆分函数:

    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