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

标签 sql regex database psql

我在使用此通配符查找时遇到问题,不确定为什么这不起作用:

我正在查找示例销售代理 42。正如您想象的那样,作为销售人员,他们并不真正关心垃圾输入 = 垃圾输出。因此,他们的代理代码通常是一团乱麻,难以整理。

代理 42 的有效示例:

  • 42
  • 30-42-22-假期
  • 42复活节
  • 42-优惠券
  • 42coupon-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]%'))

我得到了大部分有效的返回,没有一个是无效的,但我似乎仍然无法捕获像 42easter 或 29-42< 这样的例子/strong>sale-52 即使我告诉它捕获那种风格......

有什么建议吗?

最佳答案

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

WHERE agent ~ '(^|[^0-9])42($|[^0-9])'

参见 the regex demo

解释:

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

关于sql - 用于通配符查找的正则表达式帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36291861/

相关文章:

regex - 去测试正则表达式类型或语法

sql-server - SQL Server - 表元数据

sql - PostgreSQL 自定义非空约束

c# - SQL 添加数据的权限以及如何验证?

python - 我可以使用 glob 模式查询数据库吗?

javascript - 关于数组/正则表达式的问题

mysql - 在 laravel 中获取由外键引用标识的行

android - 在 Android 上定位 SQLite 数据库文件

mysql - 查询统计出现次数最多的前三项

使用 WHERE IN 时 MySQL 触发器不更新多行