【发布时间】:2020-10-10 15:29:04
【问题描述】:
我正在使用此查询按“名字和姓氏”或“姓氏和名字”进行搜索:
SELECT
"id",
"firstname",
"lastname"
FROM
"plyers"
WHERE
lower( REPLACE ( CONCAT ( lastname, firstname ), ' ', '' ) ) LIKE '%joh%'
OR
lower( REPLACE ( CONCAT ( firstname, lastname ), ' ', '' ) ) LIKE '%joh%'
ORDER BY "id" DESC
鉴于
-
我正在使用 Postgresql 13
-
用户可以使用“
John Belushi”或“Belushi John”或“lushi”或“lushi jo”进行搜索 -
搜索文本(在这种情况下为
joh)始终为lowered(),并清除了每个空格:每个单词之前、期间和之后。例如。如果我写“lushi JO”,最终的搜索文本是:“lushijo” -
此查询经常用于搜索列表中的玩家并自动完成某些选择
问题
-
你认为这是一个很好的查询吗?
-
您认为有什么方法可以避免
CONCAT(lastname,firstname)和CONCAT(firstname,lastname)? -
我应该创建哪些索引?我读到了这个:https://stackoverflow.com/a/2709967/10088259,但我不太明白如何使用它。
【问题讨论】:
-
@MarkByers 我引用了你的答案,你能举个例子更好地解释一下吗?
-
在任何数据库中,索引仅在 WHERE(或 JOIN 条件,就此而言)对直接与列中的值进行比较的表达式起作用时才有帮助。一旦您与列中的值的派生进行比较,任何可能存在的索引都只是烤面包。并且将几个谓词组合在一起增加了不可优化的复杂性......
-
@marcothesane,谢谢。您如何看待这个查询?
-
您是否允许人们(成功地)使用“ushijo”或“hnbel”进行搜索。如果不是,那么在没有空格的情况下连接它们似乎是错误的做法。
-
您的问题 2 似乎直接由您给定的数字 3 回答。那给定的不是真的给定的吗?
标签: sql postgresql performance