使用' LIKE'和' REGEXP'在SQL查询中

时间:2017-01-25 10:55:05

标签: sql sql-server regex

我试图在一个表达式上使用一些正则表达式,我对WHERE子句有两个条件。我要捕获的模式是106后跟任何数字后跟一个必须是3或4的数字,即106[0-9][3-4]

首先,我试过这个:

SELECT DISTINCT Loggers
FROM [alo].[Forests] C
WHERE (R.LogSU = 3)
AND (ForestID REGEXP '106[0-9][3-4]') 

这会产生如下错误,最好知道原因。

Msg 102, Level 15, State 1, Line 16
Incorrect syntax near 'REGEXP'.

接下来,我试过这个,现在正在运行,但我不确定这是否正在按照我的意愿行事。

SELECT DISTINCT Loggers
FROM [alo].[Forests] C
WHERE (R.LogSU = 3)
AND (ForestID LIKE '106[0-9][3-4]') 

这样做会如上所述吗?

3 个答案:

答案 0 :(得分:2)

您无需与托管代码进行交互,因为您可以使用LIKE

SELECT DISTINCT Loggers
FROM [alo].[Forests] C
WHERE (R.LogSU = 3)
AND ForestID LIKE '106[0-9][3-4]')

要明确:SQL Server不支持没有托管代码的正则表达式。根据情况,LIKE运算符可以是一个选项,但它缺乏正则表达式提供的灵活性。

如果您希望获得完整的正则表达式功能,请尝试this

答案 1 :(得分:2)

评论太长了。你指定这个:

  

我要捕获的模式是106,后跟任何数字   一个必须是3或4的数字,即106 [0-9] [3-4]

然后你用一个正则表达式给出一个例子

WHERE ForestID REGEXP '106[0-9][3-4]'

正则表达式匹配字符串内任何位置的模式。因此,这将匹配'10603'。它也会匹配'abc10694 def'。对于正则表达式而言,这是正确的,而不仅仅是一个数据库的实现。

如果这是您想要的行为,那么相应的LIKE(在SQL Server中)`是:

WHERE ForestID LIKE '%106[0-9][3-4]%'

如果您只想要5位数值,则相应的正则表达式为:

WHERE ForestID REGEXP '^106[0-9][3-4]$'

答案 2 :(得分:0)

尝试下面

SELECT DISTINCT Loggers
FROM [alo].[Forests] C
WHERE (R.LogSU = 3)
AND ((ForestID LIKE '%106_3%' OR ForestID LIKE '%106_4%'))