首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在PostregSQL中列出匹配的记录

在PostregSQL中列出匹配的记录
EN

Stack Overflow用户
提问于 2013-04-01 19:55:24
回答 3查看 114关注 0票数 0

我在搜索部分工作,比较输入值与存储的记录。具有值的数据库,如AB09CD1234。我有分解(用空格)输入字符串以匹配存储值,但当我给出像AB09 CD1234这样的输入时,它不会产生上述记录。

代码语言:javascript
复制
SELECT * FROM some_vehicle WHERE vehicle_number ILIKE E\'%AB09 CD 1234%' 

db:AB 09 C D 1234中的vehicle_number

输入字符串:AB09 CD 1234

我想结果有每一个可能的情况与输入字符串的组合。在PostgreSQL中有什么方法可以做到这一点吗?

“替换”功能能够消除字符串中的空格。在PostgreSQL中有什么方法可以消除所有特殊字符和空格吗?我尝试了不同的正则表达式,比如

regexp_replace(vehicle_number,'^a-z0-9\s','')和regexp_replace(vehicle_number,'(|-|)|\:|\@|#|\$|*|.|!|\,',''),但它不工作。

谢谢

经过几次尝试就弄明白了!已经非常接近了。"^a-zA-Z0-9“模式消除了包括空格在内的所有特殊字符,并将”g“选项作为PostgreSQL中regexp_replace的第四个参数。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-01 19:58:29

您可以这样做,消除两个值中的所有空格:

代码语言:javascript
复制
SELECT * FROM some_vehicle
WHERE replace(lower(vehicle_number), ' ', '') =
      replace(lower('AB09 CD 1234'), ' ', '');

或者,如果您想保留子字符串匹配:

代码语言:javascript
复制
SELECT * FROM some_vehicle
WHERE replace(lower(vehicle_number), ' ', '') LIKE
      ('%' || replace(lower('AB09 CD 1234'), ' ', '') || '%');

请注意,这将无法使用您当前在vehicle_number上拥有的任何索引,并将导致seq扫描(如果幸运的话,也可能是索引扫描),除非您创建一个专门的表达式索引来有效地处理此查询:

代码语言:javascript
复制
CREATE INDEX ON some_vehicle (( replace(lower(vehicle_number), ' ', '') ));

(使用LIKE的子字符串查询将是unable to use any index,因为模式以%开头。)

另一种方法是,如果您的vehicle_number值始终在完全相同的位置有空格,则将这些值存储在不带空格的位置,并将空格插入到显示层(或视图)中,因为您确切知道它们将位于何处。然后,您可以简单地将空格从任何搜索值中剔除。

票数 2
EN

Stack Overflow用户

发布于 2013-04-01 21:04:31

如果要将索引与类似于provided by @cdhowie的查询一起使用(如果这是一个大表上的常见查询,则应该使用),请使用附加模块提供的函数trigram索引

代码语言:javascript
复制
CREATE EXTENSION pg_trgm; -- once per database

CREATE INDEX some_name_idx ON some_vehicle
USING GIN (replace(vehicle_number, ' ', '')  gin_trgm_ops);

我没有使用lower(),因为这在你的问题中不是问题。匹配的查询将是:

代码语言:javascript
复制
SELECT * FROM some_vehicle
WHERE replace(vehicle_number, ' ', '')
      LIKE ('%' || replace('AB09 CD 1234', ' ', '') ||  '%');

关于SO的相关答案:

Effectively query on column that includes a substring

或者this one on dba.SE

票数 1
EN

Stack Overflow用户

发布于 2013-04-01 19:57:54

如果你是指空格的组合,那么:

代码语言:javascript
复制
SELECT * FROM some_vehicle WHERE vehicle_number ILIKE E\'%A%B%0%9%C%D%1%2%3%4%'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15743019

复制
相关文章

相似问题

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