首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查询string字段包含其他字符串的位置

查询string字段包含其他字符串的位置
EN

Stack Overflow用户
提问于 2016-08-05 22:50:30
回答 2查看 3.7K关注 0票数 1

我正在构建一个简单的搜索功能,我希望找到字符串字段中有一个字符串的所有记录。

这是我尝试过的。

代码语言:javascript
复制
term = "Moby"
MyApp.Book
|> where([p], String.contains?(p, term))
|> order_by(desc: :inserted_at)

这将返回下列书籍:

  • 白鲸
  • 桑迪奇·莫比·利恩
  • 我的手机和例子

但我明白:

代码语言:javascript
复制
`String.contains?(p, term)` is not a valid query expression
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-07 04:47:21

您必须使用String.replace/3来转义输入中的% (如果它是由最终用户输入的),然后在查询中使用like

代码语言:javascript
复制
|> where([p], like(p.title, ^"%#{String.replace(term, "%", "\\%")}%"))

示例:

代码语言:javascript
复制
iex(1)> term = "Foo%Bar"
iex(2)> query = MyApp.Post |> where([p], like(p.title, ^"%#{String.replace(term, "%", "\\%")}%")) |> order_by(desc: :inserted_at)
#Ecto.Query<from p in MyApp.Post, where: like(p.title, ^"%Foo\\%Bar%"),
 order_by: [desc: p.inserted_at]>
iex(3)> Ecto.Adapters.SQL.to_sql(:all, MyApp.Repo, query)
{"SELECT p0.\"id\", p0.\"title\", p0.\"user_id\", p0.\"inserted_at\", p0.\"updated_at\" FROM \"posts\" AS p0 WHERE (p0.\"title\" LIKE $1) ORDER BY p0.\"inserted_at\" DESC",
 ["%Foo\\%Bar%"]}

如果不进行替换,像"a%b"这样的术语将与"azb"匹配,因为%需要转义,或者它匹配任何零个或多个字符的序列。

票数 7
EN

Stack Overflow用户

发布于 2016-08-06 05:19:56

你是怎么做到的:

代码语言:javascript
复制
results = 
  from b in Book,
  where: ilike(t.name, ^"%#{params["term"]}%"),
  order_by: [desc: :inserted_at]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38798747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档