Sql как RegEx - PullRequest
       60

Sql как RegEx

8 голосов
/ 15 июля 2010

Есть ли хороший способ преобразовать регулярное выражение в LIKE внутри функции (MSSQL)?Sproc не становится сложнее, чем это:

(country\=)(?<Country>[\w\d]+)(\&sessionid\=)(?<SessionId>.+)

Группы не будут использоваться в LIKE, они существуют для другой цели.sproc поздно как:

SELECT * FROM [Table]
WHERE test_regex(regex, 'text') = 1

Где регулярное выражение является частью [Таблица]

Ответы [ 6 ]

4 голосов
/ 15 июля 2010

я бы вообразил

SELECT ...
FROM [Table]
WHERE col LIKE 'country=[A-Za-z0-9]%&sessionid=[A-Za-z0-9]%'

может быть достаточно близко? Если цель состоит в том, чтобы просто вернуть записи с непустыми значениями страны и сеанса.

Если значение в столбце не обязательно должно начинаться со слова «страна», вам придется использовать WHERE col LIKE '%country=[A-Za-z0-9]%&sessionid=[A-Za-z0-9]%', что может значительно замедлить ситуацию согласно ответу КМ.

4 голосов
/ 15 июля 2010

Можно добавить разбор регулярных выражений на сервер SQL, используя функцию CLR. Это возможно с SQL 2005 и выше. См. здесь для хорошего примера.

3 голосов
/ 15 июля 2010

Проверьте эту функцию sql. Это может помочь вам в достижении вашей задачи: PATINDEX('%[^0-9\.]%',@Input)

PATINDEX (Transact-SQL)

2 голосов
/ 15 июля 2010

Используйте функцию RegEx в SQL # , что бесплатно.У меня не было проблем с производительностью при таком подходе.

2 голосов
/ 15 июля 2010

, который будет работать очень медленно в большой таблице, анализируя строковый столбец в каждой строке.

если вы можете изменить таблицу, возможно, лучше разбить этот строковый столбец на разные столбцы, чтобы у вас был более традиционный WHERE country=... AND sessionid=..., вы даже можете добавить и использовать индекс таким образом.

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

Не из коробки. Наиболее близким к поиску регулярных выражений в SQL Server является PATINDEX (), но он не выполняет регулярные выражения.

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

...