2013-04-01 44 views
0

我正在搜索部分将输入值与存储的记录进行比较。具有像AB 09 C D 1234这样的值的数据库。我用(空格)输入字符串来与存储的值匹配,但是当我给出像AB09 CD 1234这样的输入时,它不会产生上面的记录。PostregSQL中的列表匹配记录

SELECT * FROM some_vehicle WHERE vehicle_number ILIKE E\'%AB09 CD 1234%' 

vehicle_number在DB:AB 09 C D 1234
输入字符串:AB09 CD 1234

我想导致其与输入字符串的组合每一个可能的场景。 PostgreSQL有没有办法做到这一点?

“替换”功能可以消除字符串中的空白区域。 PostgreSQL有没有办法消除所有特殊字符以及空白。我正在尝试不同的正则表达式,如

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

谢谢

经过几次尝试后发现它!非常接近它。 “[^ a-zA-Z0-9]”模式在PostgreSQL中消除了包含'g'选项的所有特殊字符作为regexp_replace的第四个参数。

+0

你的意思是“比较找到任何子字符串,忽略空格”? –

回答

2

你可以做这样的事情,消除这两个值的所有空格:

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), ' ', ''))); 

(的子查询中使用LIKE会是unable to use any index,由于图案与%开始。)

另一种选择,如果您的vehicle_number值总是有空格完全相同的地方是存储这些值没有空格,并插入在所述显示层中的空间中(或在查看),因为你确切地知道他们在哪里将会是。然后,您可以简单地删除任何搜索值中的空格。

+0

谢谢!完美的工作,“替换”功能做到了从db端消除空间的窍门。 –

+0

有没有什么办法可以在postgresql中消除所有特殊字符以及空白。我使用了regexp_replace(vehicle_number,'[^ a-z0-9 \ s]','')和regexp_replace(vehicle_number,'[\(| - | \)| \:| \ @ | \ \ | \ $ | \ * | \。| \!| \,]','')但它不工作.. –

0

如果你指的空间组合,则:

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

如果你想使用索引中包含的一个provided by @cdhowie(你应该,如果这是一个大餐桌上常见的查询),使用由附加模块pg_trgm提供的功能卦索引的查询:

CREATE EXTENSION pg_trgm; -- once per database 

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

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

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