【问题标题】:Retrieve a string between 2 same variables SQL检索 2 个相同变量 SQL 之间的字符串
【发布时间】:2014-03-20 12:40:34
【问题描述】:

我有一个类似1234-56-7-8-9012 的字符串。这可以是任意大小,- 之间的值可以是任意大小。我需要提取该字符串中间的7,但无法适应字符串大小的变化。这是我一直在使用的,但它不会改变大小:

@String = '1234-56-7-8-9012'

SUBSTRING(
        SUBSTRING(@String,CHARINDEX('-',@String)+1,LEN(@String))
        ,CHARINDEX('-'
            ,SUBSTRING(@String,CHARINDEX('-',@String)+1,LEN(@String))
        )+1
        ,1
    )

这将为我提供 7 值,但有时该值的长度为 2。基本上我需要得到第二个和第三个-之间的数字。

【问题讨论】:

    标签: sql sql-server substring charindex


    【解决方案1】:

    试试这个:

    declare @String varchar(50) = '1234-56-7-8-9012'
    
    select substring(@String, charindex('-',@String,charindex('-',@String,1)+1)+1,
        charindex('-',@String,charindex('-',@String,charindex('-',@String,1)+1)+1)-
        charindex('-',@String,charindex('-',@String,1)+1)-1)
    

    【讨论】:

      【解决方案2】:

      考虑使用正则表达式,因为我认为SQL Server support them。您现在所需要的只是知道如何通过regex 找到第二个和第三个“-”之间的数字。

      【讨论】:

      • SQL Server 不支持开箱即用的正则表达式。您必须将一些自定义 CLR 函数编译到 SQL Server 中才能获得正则表达式功能。
      • 谢谢@Dan 提供信息 :) 那么这些 CLR 函数是否可供所有人使用?
      • CLR 函数是您自己用 C# 等托管语言编写的函数,然后将它们编译到 SQL Server 中。但是我相信你可以通过搜索 Web 找到很多 CLR 代码,因为具有可以处理正则表达式的 CLR 函数是一个非常普遍的要求。
      【解决方案3】:

      请尝试:

      declare @String nvarchar(1000) = '1234-56-72-9012'
      select 
          LEFT(y, CHARINDEX('-', y)-1)
      from(
          select 
              RIGHT(x, LEN(x)-CHARINDEX('-', x)) y
          from(
              select RIGHT(@String, LEN(@String)-CHARINDEX('-', @String)) x
          )x1
      )x2
      

      【讨论】:

        【解决方案4】:

        DEMO

        SELECT SUBSTRING(@String, 
                         CHARINDEX('-',@String,CHARINDEX('-',@String,1)+1)+1,
                         CHARINDEX('-',@String,CHARINDEX('-',@String,CHARINDEX('-',@String,1)+1)+1)- CHARINDEX('-',@String,CHARINDEX('-',@String,1)+1)-1);
        

        【讨论】:

        • 他不会因为使用dual而得到一个无效的对象名吗?除非我错过了他的问题中涉及将解决方案移植到 Oracle 的部分。
        • @Poldie 是的!抱歉,我在从 fiddle 复制代码时感到困惑
        【解决方案5】:

        试试这个...你可以在任何字符之间分割一个字符串(这里是'Z')。

        DECLARE @A TABLE (STRG VARCHAR (250)) 
        INSERT INTO @A SELECT 'abcdZabcdefZabcdefghZabcdefghiZabccZaa';
        
        WITH CTE(MOD_STR,STRG)
        AS
        (
        SELECT CONVERT (VARCHAR(250),SUBSTRING(STRG,1,CHARINDEX('Z',STRG)-1))
        ,CONVERT (VARCHAR(250),SUBSTRING(STRG,CHARINDEX('Z',STRG)+1,LEN(STRG)-CHARINDEX('Z',STRG))) FROM @A
        UNION ALL
        SELECT CONVERT (VARCHAR(250),MOD_STR +';'+SUBSTRING(STRG,1,CASE WHEN CHARINDEX('Z',STRG)>1 THEN CHARINDEX('Z',STRG)-1 ELSE LEN(STRG) END))
        ,CONVERT (VARCHAR(250),SUBSTRING(STRG,CASE WHEN CHARINDEX('Z',STRG)>1 THEN CHARINDEX('Z',STRG)+1 ELSE 0 END
        ,CASE WHEN CHARINDEX('Z',STRG)>1 THEN LEN(STRG)-CHARINDEX('Z',STRG) ELSE 0 END))
        FROM CTE WHERE LEN(STRG)<>0
        )
        SELECT * FROM CTE WHERE LEN(STRG)=0
        

        【讨论】:

          猜你喜欢
          • 2016-08-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-20
          • 1970-01-01
          • 2018-12-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多