【问题标题】:How to get data from database with specific combination of name如何从具有特定名称组合的数据库中获取数据
【发布时间】:2020-12-08 09:54:42
【问题描述】:

我正在开发 ruby​​ on rails 项目,我需要使用特定组合(如 c*_c*_othername)从数据库中获取数据 * 可以编号为 1、2、3 等,如 c1_c1_anystring。前缀 c 一直是固定的。 我正在尝试使用以下代码,但它不起作用

Topic.where("name like ?", "%c*_c*_*%")

【问题讨论】:

  • 我相信这不是 Rails 而是数据库,您可以使用 DB regexps 解决它。您使用哪个数据库?
  • @Yakov postgresql 数据库
  • LIKE表达式中没有*(星号)符号,属于正则表达式和SIMILAR TONOT SIMILAR TO表达式。您必须使用这些符号 _(下划线)导致一个任意符号和 %(百分比)符号导致任意零个或多个字符序列。 postgresql.org/docs/current/…

标签: ruby-on-rails database postgresql ruby-on-rails-3


【解决方案1】:

你可能需要SIMILAR TO

试试下面的:

Topic.where('name SIMILAR TO ?', "%c\\d\\_c\\d\\_%")

如果您接受多个数字,请使用以下模式

Topic.where('name SIMILAR TO ?', "%c\\d+\\_c\\d+\\_%")

如果您不喜欢转义下划线,也可以使用~ 进行模式匹配,如文档中所述:

Topic.where('name ~ ?', ".*c\\d+_c\\d+_.*")

正则表达式中的\d匹配0到9的数字

c*_c*_othername othername 不是强制性的。有时名称只是 c5_c6,所以我也想获得这种类型的名称

请尝试以下模式

 Topic.where('name ~ ?', ".*c\\d+_c\\d+(_.*)?$")

【讨论】:

  • 谢谢你的回答......它非常接近我需要的......c*_c*_othername 其他名称不是强制性的。有时名称只是 c5_c6,所以我也想获得这种类型的名称
  • @VarinderSohal 用另一种模式更新了答案,请立即查看
【解决方案2】:

你可以试试

Topic.where("name like 'c_\\_c_\\_%'")

【讨论】:

  • 感谢您的回答,但它也返回 c1-c2_test 。我只需要 c1_c2_something
  • @VarinderSohal 我已经更新了我的答案,你可以再试一次吗?
  • 这将返回包含cd_cd_anystring 之类数据的记录,因为模式中的下划线匹配任何单个字符;
  • @user11350468,是的,我明白了,我的评论会有所帮助:D
猜你喜欢
  • 2012-12-27
  • 2014-03-29
  • 2021-05-27
  • 2011-10-30
  • 1970-01-01
  • 2021-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多