与正则表达式类似的SQL,等效于行的开始^和结束$

时间:2018-08-31 16:54:42

标签: sql regex firebird

我想在Firebird中使用类似于表达式的(^|\s)1001(\s|$)之类的正则表达式:

示例

  • abc 1001 abc-是
  • abc 121001 abc-错误
  • 1001 abc-是
  • 121001-错误
  • abc 1001-是

我尝试将其转换为Firebird中的正则表达式:

COLUMN与(^|[:WHITESPACE:])abc 1001 abc($|[:WHITESPACE:])类似,但是^(行的开头)和$(行的结尾)不起作用,查询以以下结尾:

  

无效的类似TO模式异常。

我在https://firebirdsql.org/refdocs/langrefupd25-similar-to.html的Firebird文档中找不到关于行首和行尾的任何内容

2 个答案:

答案 0 :(得分:2)

摘自《 Firebird 2.5语言参考》,SIMILAR TO documentation

  

SIMILAR TO将字符串与SQL正则表达式模式匹配。   与其他语言不同,该模式必须与整个   字符串才能成功-匹配子字符串是不够的。

换句话说,正则表达式是多行的,并且-在给定链接的文档中-不提供开始/结束锚,因为已经暗示了它们(但是整个字符串而不是每行),因为不支持部分匹配。

Firebird中的正则表达式实现符合SQL标准,该标准也未定义开始/结束锚点。

鉴于您的要求,您可能需要类似的东西:

'(abc 1001( %)?)|((% )?1001 abc)'

( %)?的含义是可选地将一个空格与任何零个或多个字符匹配。给定整个字符串必须匹配,这意味着它将找到字符串的空格或结尾,并且与(% )?类似。

如果您还需要在字符串的中间找到它,则可能需要添加其他术语(但您的示例均不建议这样做)。

或者直接等于(^|\s)1001(\s|$)

'(%[[:WHITESPACE:]])?1001([[:WHITESPACE:]]%)?'

此答案的早期版本使用(% |)而不是(% )?,但是由于没有记录空词,也不是标准的一部分,因此可能是实现错误或充其量是未记录的特征。使用它需要您自担风险。

答案 1 :(得分:2)

现在,(^|\s)1001(\s|$)不起作用,因为它意味着您希望获得部分匹配。 SIMILAR TO是不可能的:

  

SIMILAR TO将字符串与SQL正则表达式模式匹配。与其他语言不同,该模式必须匹配整个字符串才能成功-匹配子字符串是不够的。

然后,(^|\s)表示字符串开头或空格。这意味着,您应该检查字符串是否包含任何字符,然后在字符串的开头可以出现空格或仅1001($|\s)表示字符串结尾或空格。也就是说,您需要解决3种情况:

  • 任何字符,空格,1001,空格和任何字符
  • 1001,空格,任意字符
  • 任何字符,空格,1001

您需要使用

WHERE col SIMILAR TO '%[[:WHITESPACE:]]1001[[:WHITESPACE:]]%' or col SIMILAR TO '1001[[:WHITESPACE:]]%' or col SIMILAR TO '%[[:WHITESPACE:]]1001'