Sql 用于通配符查找的正则表达式帮助

Sql 用于通配符查找的正则表达式帮助,sql,regex,database,psql,Sql,Regex,Database,Psql,我对此通配符查找有问题,不确定为什么不起作用: 我正在找销售代理42的例子。正如你可以想象的那样,作为一名销售人员,他们并不真正关心垃圾输入=垃圾输出。因此,他们的代理代码通常是一堆乱七八糟的东西 代理42的有效示例: 42 30-42-22假日 42复活节 42-优惠券 42优惠券-423355 29-42sale-52 不需要显式显示的无效示例 A4290042 4297901 42cmowc209d o203f9j42po0 以下是我提出的最成功的模式: SELECT compan

我对此通配符查找有问题,不确定为什么不起作用:

我正在找销售代理42的例子。正如你可以想象的那样,作为一名销售人员,他们并不真正关心垃圾输入=垃圾输出。因此,他们的代理代码通常是一堆乱七八糟的东西

代理42的有效示例:

  • 42
  • 30-42-22假日
  • 42复活节
  • 42-优惠券
  • 42优惠券-423355
  • 29-42sale-52
不需要显式显示的无效示例

  • A4290042
  • 4297901
  • 42cmowc209d
  • o203f9j42po0
以下是我提出的最成功的模式:

SELECT company_id, agent
FROM cust_data
WHERE (agent = ('42') OR agent LIKE ('42%-%') OR agent LIKE ('%-%42') OR agent LIKE ('%-%42%-%') OR agent LIKE ('42[a-z]%-%') OR agent LIKE ('%-%42[a-z]%') OR agent LIKE ('%-%42[a-z]%-%') OR agent LIKE ('42[a-z]%'))
我得到了大部分有效的返回,没有一个无效的返回,但我似乎仍然不能抓住像复活节或29-42sale-52这样的例子,即使我告诉它抓住那种风格


有什么建议吗?

如果您需要匹配没有数字包围的
42
,您可以使用锚定(
^
代表字符串的开头,
$
代表字符串的结尾)和反义字符类的交替:

说明:

  • (^ |[^0-9])
    -字符串的开头
    ^
    或非数字
    [^0-9]
  • 42
    -文字
    42
  • ($|[^0-9])
    -字符串结尾
    $
    或非数字
    [^0-9]

那么只使用
代理(^[0-9])42($[0-9])怎么样呢?
?很好,效果非常好。如果不知道“^”符号,则排除数字比只查找字母更有效。非常感谢!虽然我对您的
42cmowc209d
o203f9j42po0
示例有些困惑,但我还是发布了这些示例,这些示例有时需要在查找中排除或不计算。有时,销售人员会输入随机代码,而这些代码恰好是他们的代理代码。它们很少,而且很容易在输出中发现,所以我想我可能不得不接受手工操作…不幸的是,你的解决方案帮了大忙。非常简单和优雅。
WHERE agent ~ '(^|[^0-9])42($|[^0-9])'