查找匹配
这个问题的第二部分:查找匹配
注:我运行的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号的所有地址,公寓号码和邮政信箱号码也可以让你大吃一惊。
我想你可以尝试这样的:
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支持。
如果我这样做,我也得到这个记录,我不希望从第二组查询。 123主要街道 –
上面修正的小错误。因此,第二个查询会变成类似于:地址(如'%23%')或地址(如'23%')或地址(如'%23')。这应该工作。它不? –
测试,我认为这可能有效。而对于2300块,我不希望在结果中有这种情况,但很高兴知道。对于邮政信箱,我会在此之前进行额外的验证 –