PostgreSQL字符串搜索部分模式删除无关字符

时间:2010-03-24 19:16:21

标签: sql regex string postgresql

寻找一个简单的SQL(PostgreSQL)正则表达式或类似的解决方案(可能是soundex),它将允许灵活的搜索。因此在搜索期间省略了破折号,空格等。作为搜索的一部分,只在表格中搜索原始字符:

目前正在使用:

SELECT * FROM Productions WHERE part_no ~* '%search_term%'

如果用户键入UTR-1,则无法显示存储在数据库中的UTR1或UTR 1.

但是当part_no有一个短划线并且用户省略了这个字符时,匹配不会发生(反之亦然)

搜索部分 UTR-1 的示例应找到以下所有匹配项。

UTR1 
UTR --1 
UTR  1

任何建议......

2 个答案:

答案 0 :(得分:2)

SELECT  *
FROM    Productions
WHERE   REGEXP_REPLACE(part_no, '[^[:alnum:]]', '') 
      = REGEXP_REPLACE('UTR-1', '[^[:alnum:]]', '')

REGEXP_REPLACE(part_no, '[^[:alnum:]]', '')上创建一个索引,以便快速工作。

答案 1 :(得分:2)

您可能会在postgresql中找到官方的内置(至少从8.3开始)全文搜索功能,值得一看:

http://www.postgresql.org/docs/8.3/static/textsearch.html

例如:

It is possible for the parser to produce overlapping tokens from the 
same of text. 

As an example, a hyphenated word will be reported both as the entire word 
and as each component: 

SELECT alias, description, token FROM ts_debug('foo-bar-beta1');

      alias      |               description                |     token     
-----------------+------------------------------------------+---------------
 numhword        | Hyphenated word, letters and digits      | foo-bar-beta1
 hword_asciipart | Hyphenated word part, all ASCII          | foo
 blank           | Space symbols                            | -
 hword_asciipart | Hyphenated word part, all ASCII          | bar
 blank           | Space symbols                            | -
 hword_numpart   | Hyphenated word part, letters and digits | beta1