Sql Like to RegEx

2019-01-27 19:27发布

Is there a good way to convert Regular Expression into LIKE inside a Function (MSSQL)? The sproc does not get more complicated than this:

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

The groups will not be used in the LIKE, they are there for another purpose.

I would like to use this inside a sproc late like:

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

Where the regex is a part of [Table]

6条回答
【Aperson】
2楼-- · 2019-01-27 19:39

It is possible to add Regular Expression parsing to SQL server, using a CLR function. This is possible from SQL 2005 and up. See here for a great example.

查看更多
我只想做你的唯一
3楼-- · 2019-01-27 19:41

that will run very slow on a large table, parsing the string column on each and every row.

if you can change the table, it might be better to split that string column into different columns, so you can have a more traditional WHERE country=... AND sessionid=..., you could even add and use an index this way.

查看更多
放我归山
4楼-- · 2019-01-27 19:51

Not out of the box. The closest you get to a regex search in SQL Server is PATINDEX(), but that doesn't do regular expressions.

If you really wanted this, you'd have to make a CLR function to run the regex instead. You may be concerned about speed, but I would say that almost nothing you would do which concerns regular expressions or patterns would be able to use an index anyway.

查看更多
三岁会撩人
5楼-- · 2019-01-27 19:52

I'd imagine

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

might be close enough? If the aim is just to bring back records with non blank country and sessionid values.

If the value in the column wouldn't necessarily start with 'country' you'd have to use WHERE col LIKE '%country=[A-Za-z0-9]%&sessionid=[A-Za-z0-9]%' which could slow things down considerably as per KM's answer.

查看更多
叛逆
6楼-- · 2019-01-27 19:58

Check this function of sql. It may help you to achieve your task : PATINDEX('%[^0-9\.]%',@Input)

PATINDEX (Transact-SQL)

查看更多
你好瞎i
7楼-- · 2019-01-27 20:02

Use the RegEx functionality within SQL# which is free. I've not had any performance issues with this approach.

查看更多
登录 后发表回答