Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >多个关键字的Ecto ILIKE?

多个关键字的Ecto ILIKE?
EN

Stack Overflow用户
提问于 2019-11-16 03:06:06
回答 2查看 347关注 0票数 1

所以现在我使用的是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dynamic(
  [u],
  ilike(
    u.name, ^"%#{String.replace(term, "%", "\\%")}%"
  ) 
)

这个术语是一个简单的字符串,比如"charlie"。我该如何将其与一系列术语一起使用,比如:["charlie", "dennis", "frank"] --没有片段,这是可能的吗?

EN

回答 2

Stack Overflow用户

发布于 2019-11-16 07:21:07

嗯,通过一些元编程,这在某种程度上是可能的。幸运的是,ecto允许在查询中使用自己的宏,所以我们所需要的就是构建自己的宏,将几个ILIKEor粘合在一起。

这里有几个陷阱。首先,我们应该让编译器忘记Kernel.or/2,否则,它将试图在适当的位置进行逻辑析取。然后,我们应该显式导入Ecto.Query.API.or/2。最后,我们应该递归地构建要传递给查询的结果AST。

总结一下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
defmodule MultiOr do
  import Ecto.Query
  import Kernel, except: [or: 2]
  import Ecto.Query.API, only: [or: 2]

  # terminating call, we are done
  defp or_ilike(var, [term1, term2] = terms) do
    quote do
      ilike(unquote(var), unquote(term1)) or ilike(unquote(var), unquote(term2))
    end
  end

  # recursive call
  defp or_ilike(var, [term | terms]) do
    quote do
      ilike(unquote(var), unquote(term)) or unquote(or_ilike(var, terms))
    end
  end

  # the macro wrapper to inject AST
  defmacrop multi_ilike(var, terms) do
    Macro.expand(or_ilike(var, terms), __CALLER__)
  end

  # test
  def test do
    Ecto.Query.where(User, [u],
      multi_ilike(u.name, ["charlie", "dennis", "frank"]))
  end
end

请注意,or_ilike/2是函数,返回AST。它们不能是宏(这可能会简化所有事情),因为不能递归地调用宏(应该在第一次调用之前预先定义)。

让我们看看。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MultiOr.test
#⇒ #Ecto.Query<from u0 in User,
#   where: ilike(u0.name, "charlie") or (ilike(u0.name, "dennis") or ilike(u0.name, "frank"))>
票数 4
EN

Stack Overflow用户

发布于 2019-11-18 10:40:48

您可以使用来自标准Ecto的or_where

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def multi_ilike(queryable, words) do
  for term <- words, reduce: queryable do
    acc -> 
      str = "%#{String.replace(term, "%", "\\%")}%"
      cond = dynamic([u], ilike(u.name, ^str))
      or_where(acc, ^cond)
  end
end

或者如果你不喜欢for

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def multi_ilike(queryable, words) do
  words
  |> Enum.map(&"%#{String.replace(&1, "%", "\\%")}%")
  |> Enum.map(&dynamic([u], ilike(u.name, ^&1))
  |> Enum.reduce(queryable, &or_where(&2, ^&1))
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58887180

复制
相关文章
Elixir, OTP, Ecto, 和 Phoenix 免费教程!
今天,DailyDrip发布了五周的免费内容,向人们介绍Elixir编程语言,并准备使用Ecto和Phoenix构建Web应用程序。我们制作了25个短片(每个约5分钟),这将使你从“Elixir是什么
时见疏星
2018/06/01
1.8K0
如何在Ubuntu上部署Elixir-Phoenix MySQL应用程序
在本教程中,您将使用Phoenix-Ecto和Mariaex配置现有的Phoenix应用程序连接到MySQL数据库。Ecto是Phoenix应用程序广泛使用的数据库包装器。Mariaex是一个数据库驱动程序,它与Ecto集成并与MySQL和MariaDB数据库进行数据传输。
挺问中原
2018/08/13
6.1K0
java小工具:实现Log中按顺序查找多个关键字
实际工作中,我们经常需要读log文件,下面小工具可以实现:判断是否按顺序打印了一系列log,比如设备信息(online,connect,disconnect,offline),这也是笔者在实际工作中遇到的场景,记录如下。
半旧518
2022/10/26
4210
Django官方文档小结(二) -- QuerySet
字段查找是指定SQL WHERE子句的内容的方式。它们被指定为QuerySet方法的关键字参数filter(), exclude()并且get()。
Autooooooo
2020/11/09
1.8K0
linux 用 grep 查找单个或多个字符串(关键字)
转载自 https://blog.csdn.net/qq_21840201/article/details/80344844
allsmallpig
2021/02/25
16.9K0
volatile关键字经常用在多个线程并发写_多线程安全的单例模式
对应饿汉式,因为饿汉式在类加载时创建实例,而一个类在生命周期中只被加载一次,也就是说,饿汉式在线程访问前就已经创建好了唯一的那个实例,因此无论多少个线程同时访问,最终获取到的都是一个实例。
全栈程序员站长
2022/09/23
2220
Lamda表达式详解
1、λ 希腊字母表中排序第十一位的字母,英语名称为 Lamda 2、避免匿名内部类定义过多 3、可以让你的代码看起来很简洁 4、去掉了一堆没有意义的代码,留下核心的逻辑 3、其实质属于函数式编程的概念
全栈程序员站长
2022/07/01
3060
Lamda表达式详解
PostgreSQL 基础与实践
最近想着把工作中常用到的技术点与工具做一些整理总结,一方面梳理一下这些知识点,加深使用记忆,也可以作为之后使用的查阅。
pseudoyu
2023/04/11
1.3K0
PostgreSQL 基础与实践
Java 多线程基础
多线程(multithreading):指从软件或者硬件上实现多个线程并发执行的技术。
星姮十织
2022/01/02
3580
PostgreSQL - 模糊查询
like、not like在SQL中用于模糊查询,%表示任意个字符,_表示单个任意字符,如果需要在模糊查询中查询这两个通配符,需要用ESCAPE进行转义,如下:
雨临Lewis
2022/01/11
4.6K0
Django3.2边学边记—Adimn站点管理
ModelAdmin类可以控制不同模型在Admin界面中的展示方式,主要包括在列表页的展示方式、添加修改页的展示方式
玖柒的小窝
2021/09/24
1.2K0
Django3.2边学边记—Adimn站点管理
synchronized关键字和volatile关键字的区别
线程原子性是指不能在被拆分的操作。在说的直白点就是我们知道线程在执行时是需要一个前提条件的那就是需要获取到系统CPU的执行资格,虽然线程获取到了执行资格但CPU也可以随时切换,不管线程是否执行完毕。线程原子性就是说如果线程已经获取到了CPU的执行资格,如果线程在没有执行完时,任何线程是不能够中断的。
吉林乌拉
2019/08/14
7500
织梦DEDECMS自动内链一个关键字对应多个链接随机调用的设置方法
利用dedecsm织梦自动内链的时候,可能会有一个关键字对应多个网站,随机调用网址的需求,比如(织梦自动内链)这个关键词一些文章内链链接到网站的首页,一些链接到文章页,但是织梦中原带的功能,一个关键词只能加一个网址,网上找了很多办法也没有找到可用的,还好米米素材网懂一点点php,哪就自己动手吧。下面是织梦自动内链一个关键字对应多个链接,随机调用这些链接的解决办法。
米米素材网
2023/03/23
1.3K0
织梦DEDECMS自动内链一个关键字对应多个链接随机调用的设置方法
【经验分享】Django开发中常用到的数据库操作总结
传多个参数:result = Test.objects.filter(id=1, name=’test’)
腾讯蓝鲸助手
2022/06/28
6640
Java中多个异常的捕获顺序(多个catch)
import java.io.IOException;   public class ExceptionTryCatchTest {       public void doSomething() throws IOException{           System.out.println("do somthing");       }       public static void main(String[] args){           ExceptionTryCatchTest etct = new ExceptionTryCatchTest();           try {               etct.doSomething();           } catch (Exception e) {                          } catch (IOException e) {                          }       }      }
用户7886150
2021/04/25
3.8K0
java的this关键字
class point{ int x; int y; point(int x,int y){ this.x=x;//如果形参和属性名相同,为了区分开来,必须要在属性名前加this y=y;//若不加this,则其值还是默认定义的0 } } public class This { public static void main(String[] args) { point p = new point(1,2);
孙晨c
2019/10/08
5020
java的this关键字
this关键字的作用
以上代码中 name=name 其实全是形参的name。 私有的实例变量时无法赋值的。 这时候this不能省
西柚dzh
2022/06/09
2200
【C语言】 C 语言 关键字分析 ( 属性关键字 | 常量关键字 | 结构体关键字 | 联合体关键字 | 枚举关键字 | 命名关键字 | 杂项关键字)
>**auto不能修饰全局变量** : auto 关键字不能修饰全局变量, 因为 ***auto 修饰的变量存储在栈内存中, 全局变量存储在全局区, 此时出现了冲突***. 如果使用auto修饰全局变量, 编译时会报错.
韩曙亮
2023/03/27
2.4K0
【C语言】 C 语言 关键字分析 ( 属性关键字 | 常量关键字 | 结构体关键字 | 联合体关键字 | 枚举关键字 | 命名关键字 | 杂项关键字)
java之this关键字和super关键字的区别
编号 区别点 this super 1 访问属性 访问本类中的属性,如果本类没有此 属性则从父类中继续查找 访问父类中的属性 2 调用方法 访问本类中的方法 直接访问父类中的方法 3 调用构造器 调用本类的构造器, 必须放在本类构造器的第一行 调用父类的构造器, 必须放在子类构造器的第一行 4 特殊 表示当前对象 无此概念
西西嘛呦
2020/08/26
3890
点击加载更多

相似问题

使用ilike在Ecto中搜索部分字符串

112

使用ilike和SQL连接的Ecto查询的正确语法是什么?

115

Postgresql在OR中有多个ILIKE查询

19

‘'ilike’关键字不适用于spark SQL

131

Ecto使用多个节点

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文