2010-06-15 4 views
0

Вот ситуация, в которой я находилась: У нас есть поле в нашей базе данных, которое содержит 3-значное число, окруженное некоторым текстом. Это число фактически является PK в другой таблице, и мне нужно извлечь его, чтобы я мог реализовать правильные отношения FK. Вот пример того, что бы в настоящее время находятся в колонке:Использование RegEx в SQL-запросе

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

Итак, что я ищу сделать, это извлечь «305» из колонки, и мы надеемся, в конечном итоге результат, который выглядит примерно так (псевдокод)

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

мне кажется, что с помощью Regex матч в моем запросе является наиболее эффективным способом сделать это. Может ли кто-нибудь указать мне в правильном направлении?

EDIT: Мы используем 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

RegExp в SQL определяется SQL-стандартом, но большинство баз данных реализован свой собственный синтаксис, вы должны сказать нам имя продукта РСУБД;)

+1

Должен быть комментарий, но я знаю, что у вас еще нет репутации 50! –

+0

Извините, обновил мой вопрос, чтобы указать, что я использую SQL Server 2005 –

0

Microsoft, кажется, предлагают использовать сборки CLR, чтобы сделать Regex по шаблону в SQL Server 2005.

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

Помимо LIKE (что нет я собираюсь решить вашу проблему). Я не знаю о встроенной функции сопоставления шаблонов в SQL Server 2005 (то есть более совершенной, чем простой поиск строк).

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

Единственный способ получить доступ к функциям RegEx типа в SQL Server 2005 (и, вероятно, 2008) в письменном виде (или загрузки) и с помощью функции 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 имеет проникновенно ограниченный набор функций обработки строк), но она работает.

Смежные вопросы