sql - rails : How can I take comma separated values and build an SQL query?

标签 sql ruby-on-rails ruby postgresql

使用 Rails 3 Active Record 模型 (postgres db) 我想获取类似这样的用户搜索输入:

"some string, some other string, final string"

从那里我想用逗号拆分字符串并构建一个看起来像这样的 SQL 查询

SELECT * FROM items WHERE item_name SIMILAR TO '%(some string)%' OR item_name SIMILAR TO '%(some other string)%' OR item_name SIMILAR TO '%(final string)%'

由于我对 Ruby 的语法相当不熟悉,所以我正在努力想出一种构建此查询的方法。

最佳答案

我会跳过 SIMILAR TO 并直接转到 POSIX regexes ,我很确定 SIMILAR TO 会在内部被翻译成正则表达式,所以何必呢?另外,~ 会让你使用 ANY产生一个很好的可读表达式。你可以这样做:

str   = 'some string, some other string, final string'
items = Item.where('item_name ~ any(array[?])', str.split(/\s*,\s*/))

这将最终像这样运行 SQL:

select "items".* from "items" where item_name ~ any(array['some string', 'some other string', 'final string'])

这将产生与您的 SIMILAR TO 版本相同的结果,而无需一堆字符串争论。

如果您遇到可以包含正则表达式元字符的 CSV 字符串,那么您可能希望在混合中加入一些转义。反斜杠任何不是字母数字的东西应该足够安全:

str   = 'some string, some other string, final string'
pats  = str.split(/\s*,\s*/)
           .map { |s| s.gsub(/\p{^Alnum}/) { '\\' + $& } }
items = Item.where('item_name ~ any(array[?])', pats)

切换到 LIKE 也是一个选项,那么你只需要担心 _%:

str   = 'some string, some other string, final string'
pats  = str.split(/\s*,\s*/)
           .map { |s| s.gsub(/[_%]/, '%' => '\\%', '_' => '\\_') }
           .map { |s| '%' + s + '%' }
items = Item.where('item_name like any(array[?])', pats)

在现实生活中,您会将转义困惑(以及“添加 LIKE 百分号”困惑)分解为实用程序方法,以使您的代码更清晰。

如果您不关心大小写,那么您可以使用 ~*ilike 进行不区分大小写的模式匹配。

关于sql - rails : How can I take comma separated values and build an SQL query?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18927419/

相关文章:

mysql - 使用 MATCH AGAINST 将查询从 MySQL 转换为 Oracle

ruby-on-rails - Rails DateTime 对象不是我所期望的

ruby-on-rails - rails 4.2.0 ActionController::UrlGenerationError

ruby-on-rails - 尝试运行 gem install 时出错

ruby - 返回 Ruby 中字符串中所有正则表达式出现的索引

ruby - 使用带有 require/rescue 的单行条件

sql - 甲骨文。将 varchar 值 "40.00"转换为数字

c# - sql server 返回 long.parse 显示错误

mysql - 使用 MySQL 查找记录集中值的位置

ruby-on-rails - sudo gem install pg -v '0.18.4' 在 macos sierra high (RoR) 上不起作用