【问题标题】:How do I extract part of a string in t-sql如何在 t-sql 中提取部分字符串
【发布时间】:2008-12-17 16:29:05
【问题描述】:

如果我有以下 nvarchar 变量 - BTA200,如何从中提取 BTA?

另外,如果我有不同的长度,例如 BTA50、BTA030,我怎样才能只提取数字部分?

【问题讨论】:

    标签: sql-server tsql string


    【解决方案1】:

    我会推荐 PatIndex 和 Left 的组合。精心构造,无论您的数据是什么样的,您都可以编写始终有效的查询。

    例如:

    Declare @Temp Table(Data VarChar(20))
    
    Insert Into @Temp Values('BTA200')
    Insert Into @Temp Values('BTA50')
    Insert Into @Temp Values('BTA030')
    Insert Into @Temp Values('BTA')
    Insert Into @Temp Values('123')
    Insert Into @Temp Values('X999')
    
    Select Data, Left(Data, PatIndex('%[0-9]%', Data + '1') - 1)
    From   @Temp
    

    PatIndex 将查找第一个字符在 0-9 范围内,并返回它的字符位置,您可以使用 LEFT 函数来提取正确的数据。请注意,PatIndex 实际上是使用 Data + '1'。这可以保护我们免受找不到数字的数据的影响。如果没有数字,PatIndex 将返回 0。在这种情况下,LEFT 函数会出错,因为我们使用的是 Left(Data, PatIndex - 1)。当 PatIndex 返回 0 时,我们会以 Left(Data, -1) 结束,它会返回一个错误。

    仍有可能失败。要获得完整的解释,我鼓励您阅读:

    Extracting numbers with SQL Server

    那篇文章展示了如何从字符串中获取数字。在您的情况下,您想要获取字母字符。但是,这个过程非常相似,您可能可以从中学到一些有用的东西。

    【讨论】:

    • 如何只提取数字部分?
    • 看看我提供的链接。有一个用户定义的函数可用于仅提取数字部分。
    • 您在链接中使用的 8000 是否只是一个任意数字?
    • 我使用了 8000,因为这是可以用于 varchar 列的最大长度。我决定使用 varchar(8000) 而不是 varchar(max) 以便该函数可以与 SQL2000 一起使用。如果您使用的是SQL2005(或以上),您可以将8000更改为最大值。
    • 我试过这个来提取数字,但它返回空白: LEFT(SubString(GSA,PatIndex('%[0-9]%',GSA),8000),PatIndex('% [ 0-9]%',SubString(GSA,PatIndex('%[0-9]%',GSA),8000) + '1') - 1)
    【解决方案2】:

    substring(field, 1,3) 将适用于您的示例。

    select substring(field, 1,3) from table
    

    另外,如果字母部分是可变长度的,你可以这样做来提取字母部分:

    select substring(field, 1, PATINDEX('%[1234567890]%', field) -1) 
    from table
    where PATINDEX('%[1234567890]%', field) > 0
    

    【讨论】:

      【解决方案3】:

      LEFT ('BTA200', 3) 将适用于您给出的示例,如:

      SELECT LEFT(MyField, 3)
      FROM MyTable
      

      要提取数字部分,您可以使用此代码

      SELECT RIGHT(MyField, LEN(MyField) - 3)
      FROM MyTable
      WHERE MyField LIKE 'BTA%' 
      --Only have this test if your data does not always start with BTA.
      

      【讨论】:

      • 如果长度不同,比如 BTA10 或 BTA1 怎么办?
      • 我给出的代码将根据要求提取字母部分。如果这不是您需要的,请更新您的问题:-)
      • 好的,抱歉,我现在看到了。如果我想提取数字部分怎么办?
      • 我收到错误:传递给 RIGHT 函数的长度参数无效。
      • 是的,我该如何检查呢?
      【解决方案4】:
      declare @data as varchar(50)
      set @data='ciao335'
      
      
      --get text
      Select Left(@Data, PatIndex('%[0-9]%', @Data + '1') - 1)    ---->>ciao
      
      --get numeric
      Select right(@Data, len(@data) - (PatIndex('%[0-9]%', @Data )-1) )   ---->>335
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多