使用 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/