2010-06-15 57 views
0

以下是我遇到的情况:我们的数据库中有一个包含3位数字的字段,其中包含一些文本。这个数字实际上是另一个表中的一个PK,我需要将其提取出来,以便我可以实现正确的FK关系。下面是目前你会驻留在列的例子:在SQL查询中使用RegEx

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

那么,什么我希望做的是提取“305”从列,并希望与看起来是这样的结果结束了(伪代码)

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

在我看来,在我的查询中使用正则表达式匹配是最有效的方法。任何人都可以指引我走向正确的方向吗?

编辑:我们使用SQL Server 2005

回答

0

这是基于Pranay的是已经被改变了第一个答案。

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

1

在SQL正则表达式是由SQL标准定义,但大多数数据库实现自己的语法,你应该告诉我们你的RDBMS的产品名称;)

+1

应该是一个评论,但我知道你还没有50代表! – 2010-06-15 13:33:57

+0

对不起,我的问题已更新,表明我正在使用SQL Server 2005 – 2010-06-15 13:34:13

0

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

PostgreSQL的解决方案:

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 
0

的唯一方法写(或下载),并使用CLR函数来访问SQL中的2005年(也许2008年)是正则表达式类型的功能。

如果所有的字符串总是以这样一种方式进行格式化,您可以识别所需的特定数字,则可以执行下列操作。这是基于(大)假设,在字符串中找到的第一组圆括号包含您想要的数字。

/* 

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(因为SQL有一个有限的字符串操作函数集),但它的工作原理。