代码之家  ›  专栏  ›  技术社区  ›  Jim B

在SQL查询中使用RegEx

  •  0
  • Jim B  · 技术社区  · 14 年前

    我所处的情况是:我们的数据库中有一个字段,包含一个3位数的数字,周围有一些文本。这个数字实际上是另一个表中的一个PK,我需要将其提取出来,以便实现一个正确的FK关系。下面是列中当前驻留内容的示例:

    Some Text Goes Here - (305) Followed By Some More Text
    

    所以,我要做的是从列中提取'305',并希望最终得到类似这样的结果(伪代码)

    SELECT
       <My Extracted Value>,
       Original Column Text,
       Id
    FROM dbo.MyTable
    

    在我看来,在查询中使用正则表达式匹配是最有效的方法。有人能给我指出正确的方向吗?

    编辑:我们使用的是SQLServer2005

    5 回复  |  直到 14 年前
        1
  •  0
  •   Martin Smith    14 年前

    DECLARE @NumStr varchar(1000)
    SET @NumStr = 'Some Text Goes Here - (305) Followed By Some More Text';
    SELECT SUBSTRING(@NumStr,PATINDEX('%[0-9][0-9][0-9]%',@NumStr),3)
    

    退换商品 305

        2
  •  1
  •   Tobias P.    14 年前

    SQL中的RegExp是由SQL标准定义的,但是大多数数据库都实现了自己的语法,您应该告诉我们RDBMS的产品名称;)

        3
  •  0
  •   Lucero    14 年前

    微软似乎建议在SQLServer2005中使用CLR程序集进行正则表达式模式匹配。

    http://msdn.microsoft.com/en-us/magazine/cc163473.aspx

    除了LIKE(这不会解决您的问题)之外,我不知道sqlserver2005中有内置的模式匹配功能(也就是说,比简单的字符串搜索更高级)。

        4
  •  0
  •   small_duck    14 年前

    就在我在Postgres中实现了一个解决方案之后,我看到您正在使用SqlServer。。。只是为了记录,然后,用一个正则表达式提取括号中的数据。

    create table main(id text not null)
    insert into main values('some text (44) other text');
    insert into main values('and more text (78) and even more');
    
    select substring(id from '\\(([^\\(]+)\\)') from main
    
        5
  •  0
  •   Philip Kelley    14 年前

    在SQL2005(可能是2008)中访问RegEx类型函数的唯一方法是编写(或下载)和使用CLR函数。

    如果所有字符串的格式都是这样的,即您可以标识所需的特定数字,那么您可以执行以下操作。这是基于(大)假设,即在字符串中找到的第一组括号包含所需的数字。

    /*
    
    CREATE TABLE MyTable
     (
       MyText  varchar(500)  not null
     )
    
    INSERT MyTable values ('Some Text Goes Here - (305) Followed By Some More Text')
    
    */
    
    SELECT
       MyText  --  String
      ,charindex('(', MyText)  --  Where's the open parenthesis
      ,charindex(')', MyText)  --  Where's the closed parenthesis
      ,substring(MyText
                 ,charindex('(', MyText) + 1, charindex(')'
                 ,MyText) - charindex('(', MyText) - 1)  --  Glom it all together
     from MyTable
    

    很尴尬(因为SQL有一组少得可怜的字符串操作函数),但它可以工作。