查找匹配

问题描述:

这个问题的第二部分:查找匹配

注:我运行的Postgres 7.4,是的,我们正在升级

示例数据

address   | zip 
-----------------------+-------------+ 
123 main street  | 12345 
-----------------------+-------------+ 
23 where road   | 12345 
-----------------------+-------------+ 
South 23 where lane | 12345 

查询

SELECT address 
FROM tbl 
WHERE zip = 12345 
AND LOWER(substring(address, '^\\w+')) = LOWER('lane') 

也试过

SELECT address 
FROM tbl 
WHERE zip = 12345 
AND LOWER(substring(address, '\\w+')) = LOWER('lane') 

SELECT address 
FROM tbl 
WHERE zip = 12345 
AND LOWER(substring(address, '^\\w')) = LOWER('lane') 

SELECT address 
FROM tbl 
WHERE zip = 12345 
AND LOWER(substring(address, '\\w')) = LOWER('lane') 

我想是能够搜索在地址栏中的地址的任何部分。因此,如果我需要所有包含lane这个词的行,我可以通过lane和zip返回所有行。这会给我:

address   | zip 
-----------------------+-------------+ 
South 23 where lane | 12345 

或者,如果我需要的所有行和23个地址,这会给我:

address   | zip 
-----------------------+-------------+ 
23 where road   | 12345 
-----------------------+-------------+ 
South 23 where lane | 12345 

有什么我可以在例如查询更改上面允许这个?

这取决于你所说的“所有具有单词通道的行”的含义。一个正则表达式可能不会在这里工作。

with tbl as (
    select '123 main street' address, '12345' zip 
    union all 
    select '23 where road', '12345' zip 
    union all 
    select 'South 23 where lane', '12345' zip 
    union all 
    select '245 Meadowlane Dr', '12345' 
    union all 
    select '764 Pine Lane Ave', '12345' 
) 
select * from tbl 
where zip = '12345' 
    and (
      address ~* '^lane .*' 
     or address ~* '.* lane .*' 
     or address ~* '.* lane$' 
    ); 

address    zip 
-- 
South 23 where lane 12345 
764 Pine Lane Ave  12345 

那种正则表达式将不会返回“123大街”,如果你在WHERE子句中使用“23”,而不是“车道”。但它也不会让你查询枫树街2300号的所有地址,公寓号码和邮政信箱号码也可以让你大吃一惊。

+0

测试,我认为这可能有效。而对于2300块,我不希望在结果中有这种情况,但很高兴知道。对于邮政信箱,我会在此之前进行额外的验证 –

我想你可以尝试这样的:

SELECT * 
FROM tbl 
WHERE zip = 12345 
AND (address like '% ' + 'lane' + ' %' -- check in middle 
or address like 'lane' + ' %' -- check at beginning 
or address like '% ' + 'lane') -- check at end 

的Bt我建议反对。

如果你陷入困境的话,你可能会看到“全文搜索”功能更好,特别是因为性能不会很好。

虽然我听到新的Postgres支持。

+0

如果我这样做,我也得到这个记录,我不希望从第二组查询。 123主要街道 –

+0

上面修正的小错误。因此,第二个查询会变成类似于:地址(如'%23%')或地址(如'23%')或地址(如'%23')。这应该工作。它不? –