这个问题的第二部分:
注意:我正在运行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
我可以在上面的示例查询中更改以允许此操作吗?
答案 0 :(得分:1)
这取决于“所有具有单词lane的行”的含义。单个正则表达式可能无法在这里起作用。
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
如果在WHERE子句中使用“23”而不是“lane”,那种正则表达式将不会返回“123 main street”。但它也不会让你查询2300街区Maple St.公寓号码中的所有地址,邮政信箱号码也会让你感到惊讶。
答案 1 :(得分:0)
我想你可以尝试类似的东西:
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
我建议不要这样做。
如果你遇到麻烦,你可能会更好地看看“全文搜索”功能,特别是因为性能不会很好。
我听说新的Postgres支持这个。