我正在尝试进行 Ecto 查询,其中连接给定查询结果的名字和姓氏,然后使用查询字符串执行类似搜索。例如,我可能想在数据库中搜索所有以“Bob J”开头的姓名。目前,我的代码如下所示:
pending_result_custom_search = from result in pending_result_query,
where: ilike(fragment("CONCAT(?, '',?)", result.first_name, result.last_name), ^query)
(pending_result_query 是我之前编写的查询)
这种方法不起作用,我继续得到一个空的查询集。如果我执行这样的查询
query = "Bob"
pending_result_custom_search = from result in pending_result_query,
where: ilike(fragment("CONCAT(?, '',?)", "%Bob%", ""), ^query)
我获得了正确的功能。
使第一种方法正常工作的正确语法是什么?
我认为在你的情况下我只会使用
fragment
,例如
query = "%" <> "Bob" <> "%"
pending_result_custom_search = from result in pending_result_query,
where: fragment("first_name || last_name ILIKE ?", ^query)
这样你就可以将焦点转移到 PostGres 并使用它的函数,而不用过多担心它们的 Ecto 抽象。在上面的示例中,我使用
||
来连接列值,但如果需要,您可以使用 PostGres 的 CONCAT()
:
pending_result_custom_search = from result in pending_result_query,
where: fragment("CONCAT(first_name, last_name) ILIKE ?", ^query)
请注意,此处的两个示例在
first_name
和 last_name
之间均不包含空格。另外,我在绑定之前将 %
字符添加到搜索查询中。