【问题标题】:T-SQL Pattern Match/Regex 0 or 1 occurrences of square bracketT-SQL 模式匹配/正则表达式 0 或 1 次方括号
【发布时间】:2023-03-18 04:00:01
【问题描述】:

我一直在尝试匹配,使用 LIKE 或 PATINDEX 格式的字符串

[subdomain.domain.com].[dbo].[MyDatabase]

出现在 SQL 字符串中

而字符串 [subdomain.domain.com] 将始终以这种格式出现

[dbo] 和/或 [MyDatabase] 可以带或不带方括号

我已经尝试了以下

WHERE SQLString LIKE '%[[]subdomain.domain.com[]].[[]{0,1}dbo[]]{0,1}.[[]{0,1}MyDatabase[]] {0,1}%'

WHERE SQLString LIKE '%\[subdomain.domain.com\].\[{0,1}dbo\]{0,1}.\[{0,1}MyDatabase\]{0,1}% '转义'\'

我可以创建多个 WHERE 或 WHERE 语句,涵盖每种可能性,但想了解在这种情况下为什么正则表达式不起作用。

【问题讨论】:

  • 您使用的是 SQL Server 吗?如果有,是什么版本?
  • Like RegEx。是什么让您认为它们是等价的?
  • @JakeMc 这是 SQL Server 2012 SP4 v 11.07493.4
  • @HABO 不确定我理解。我了解正则表达式/模式匹配结构可以在 LIKE 语句中使用。不确定我是否暗示等效?
  • {0,1} 之类的元素似乎没有为 like patterns 记录。您在like 模式中包含该语法的文档来源是什么?

标签: tsql escaping sql-like brackets square


【解决方案1】:

square bracketlike 子句中的一个特殊字符,表示“指定范围内的任何单个字符(例如 [a-z])。”

您可以在文本中可能出现方括号的任何地方使用% 特殊字符。比如:

WHERE SQLString LIKE '%subdomain.domain.com%.%dbo%.%MyDatabase%'

由于它将匹配“任何 个或多个字符的字符串”,如果那里有方括号,很好,如果没有,它仍然匹配。

【讨论】:

  • 感谢 Jake,尽管我已经尝试过了。它有点“贪婪”并且会拿起例如“subdomain.domain.com 大量文本 AnotherDatabase.dbo.table 更多文本 MyDatabase.dbo.Mytable”。我希望匹配那些特定的模式。似乎 {0,1} 修饰符可能不适用于 tsql
  • HI Jake,方括号也用于转义,虽然看起来我已经过分热心了,在我提供的第一个示例中,似乎结束方括号不需要转义。
  • @Matt 我相信您需要在 Like 子句末尾使用 ESCAPE 关键字明确定义方括号之一作为 escape_character 才能用作 escape_character。就此而言,您可以定义任何单个字符,也许对于下一个将看到该查询的开发人员来说更具可读性。还可以尝试使用_ 而不是%,因为下划线匹配单个字符
猜你喜欢
  • 2015-11-14
  • 1970-01-01
  • 2013-06-18
  • 2014-01-25
  • 1970-01-01
  • 2018-04-06
  • 2018-08-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多