【问题标题】:Using 'LIKE' and 'REGEXP' in a SQL query在 SQL 查询中使用“LIKE”和“REGEXP”
【发布时间】:2017-01-25 10:55:04
【问题描述】:

我正在尝试在 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]') 

会按照我上面描述的那样做吗?

【问题讨论】:

  • 标记您正在使用的 dbms。 (REGEXP 和 LIKE 行为是特定于产品的。)
  • 哪个数据库?请添加您遇到的错误。
  • 两者都 - 完成:错误和 dbms。
  • SQL Server 不支持正则表达式
  • @DanielShillcock: patindex 不支持任何正则表达式——至少不支持the manual: "pattern 是一个字符表达式,包含要查找的序列。可以使用通配符;但是,% 字符必须在模式之前和之后(搜索第一个或最后一个字符时除外)。"

标签: sql sql-server regex


【解决方案1】:

您不需要与托管代码交互,因为您可以使用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) 我的第二步是正确指定 106 后跟任何数字,然后是必须是 3 或 4 的数字? 2)托管代码是什么意思?谢谢 - 对 SQL 还是很陌生
【解决方案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]$'

【讨论】:

    【解决方案3】:

    试试下面

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-18
      • 1970-01-01
      • 1970-01-01
      • 2015-09-29
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 2013-10-18
      相关资源
      最近更新 更多