在字段中查找数据库中的匹配项

时间:2011-11-16 15:31:59

标签: sql postgresql

这个问题的第二部分:

注意:我正在运行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

我可以在上面的示例查询中更改以允许此操作吗?

2 个答案:

答案 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支持这个。