Использование RegEx в запросе SQL - PullRequest
0 голосов
/ 15 июня 2010

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

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

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

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

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

РЕДАКТИРОВАТЬ: Мы используем SQL Server 2005

Ответы [ 5 ]

1 голос
/ 15 июня 2010

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

0 голосов
/ 15 июня 2010

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

0 голосов
/ 15 июня 2010

Это основано на первом ответе 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

0 голосов
/ 15 июня 2010

Сразу после того, как я реализовал решение в 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 голосов
/ 15 июня 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...