Php 在PostregSQL中列出匹配的记录

Php 在PostregSQL中列出匹配的记录,php,sql,postgresql,indexing,pattern-matching,Php,Sql,Postgresql,Indexing,Pattern Matching,我正在研究搜索部分,其中比较输入值和存储记录。具有类似AB 09 C D 1234的值的数据库。我有分解(带空格)的输入字符串来匹配存储的值,但当我给出像AB09 CD 1234这样的输入时,它不会产生上面的记录 SELECT * FROM some_vehicle WHERE vehicle_number ILIKE E\'%AB09 CD 1234%' 以db为单位的车辆编号:AB 09 C D 1234 输入字符串:AB09 CD 1234 我希望得到每一个可能的场景和输入字符串的组合

我正在研究搜索部分,其中比较输入值和存储记录。具有类似AB 09 C D 1234的值的数据库。我有分解(带空格)的输入字符串来匹配存储的值,但当我给出像AB09 CD 1234这样的输入时,它不会产生上面的记录

SELECT * FROM some_vehicle WHERE vehicle_number ILIKE E\'%AB09 CD 1234%' 
以db为单位的车辆编号:
AB 09 C D 1234

输入字符串:
AB09 CD 1234

我希望得到每一个可能的场景和输入字符串的组合。在PostgreSQL中有什么方法可以做到这一点吗

“replace”函数可以消除字符串中的空白。PostgreSQL中是否有任何方法可以消除所有特殊字符以及空格。我在尝试不同的正则表达式,比如

regexp_更换(车辆编号“[^a-z0-9\s]”,'')和 regexp|u replace(车辆编号,[(|-|)|\:| \@| \$|*。|!| \,],'') 但它不起作用

谢谢


几次尝试后,我就明白了!非常接近它。“[^a-zA-Z0-9]”模式消除所有特殊字符,包括带有“g”选项的空格,作为PostgreSQL中regexp_replace的第四个参数。

如果您指的是空格的组合,则:

SELECT * FROM some_vehicle WHERE vehicle_number ILIKE E\'%A%B%0%9%C%D%1%2%3%4%'

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

SELECT * FROM some_vehicle WHERE vehicle_number ILIKE E\'%A%B%0%9%C%D%1%2%3%4%'

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

SELECT * FROM some_vehicle
WHERE replace(lower(vehicle_number), ' ', '') =
      replace(lower('AB09 CD 1234'), ' ', '');
或者,如果要保留子字符串匹配:

SELECT * FROM some_vehicle
WHERE replace(lower(vehicle_number), ' ', '') LIKE
      ('%' || replace(lower('AB09 CD 1234'), ' ', '') || '%');
请注意,这将无法使用您当前在
车辆号上的任何索引,并将导致序列扫描(或可能的索引扫描,如果您幸运的话),除非您创建专门的表达式索引以有效处理此查询:

CREATE INDEX ON some_vehicle (( replace(lower(vehicle_number), ' ', '') ));
(由于模式以
%
开头,使用类似
的子字符串查询将是)


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

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

SELECT * FROM some_vehicle
WHERE replace(lower(vehicle_number), ' ', '') =
      replace(lower('AB09 CD 1234'), ' ', '');
或者,如果要保留子字符串匹配:

SELECT * FROM some_vehicle
WHERE replace(lower(vehicle_number), ' ', '') LIKE
      ('%' || replace(lower('AB09 CD 1234'), ' ', '') || '%');
请注意,这将无法使用您当前在
车辆号上的任何索引,并将导致序列扫描(或可能的索引扫描,如果您幸运的话),除非您创建专门的表达式索引以有效处理此查询:

CREATE INDEX ON some_vehicle (( replace(lower(vehicle_number), ' ', '') ));
(由于模式以
%
开头,使用类似
的子字符串查询将是)


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

如果您想将索引与类似的查询一起使用(如果这是一个大表上的常见查询,您应该这样做),请使用附加模块提供的功能性三元索引:

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

SELECT * FROM some_vehicle
WHERE replace(vehicle_number, ' ', '')
      LIKE ('%' || replace('AB09 CD 1234', ' ', '') ||  '%');
关于SO的相关回答:


或者。

如果您想将索引与类似的查询一起使用(如果这是一个大表上的常见查询,您应该使用该索引),请使用附加模块提供的功能性三元索引:

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

SELECT * FROM some_vehicle
WHERE replace(vehicle_number, ' ', '')
      LIKE ('%' || replace('AB09 CD 1234', ' ', '') ||  '%');
关于SO的相关回答:


或者。

您的意思是“比较以查找任何子字符串,忽略空格”?您的意思是“比较以查找任何子字符串,忽略空格”?谢谢!“replace”函数很好地消除了数据库端的空格。在postgresql中有没有办法消除所有特殊字符以及空格。我尝试了不同的reg表达式,比如regexp|u replace(车辆编号,[^a-z0-9\s],'')和regexp|u replace(车辆编号,[(|-|)|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|!“replace”函数很好地消除了数据库端的空格。在postgresql中有没有办法消除所有特殊字符以及空格。我尝试了不同的reg表达式,比如regexp|u replace(车辆编号,[^a-z0-9\s],'')和regexp|u replace(车辆编号,[(|-|)|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-。。