Найти совпадение в базе данных в поле - PullRequest
0 голосов
/ 16 ноября 2011

Часть вторая этого вопроса:

ПРИМЕЧАНИЕ: я использую 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, я мог бы передать строку и почтовый индекс, чтобы вернуть все строки. Это дало бы мне:

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

Или, если бы мне нужно было все строки с адресом 23, это дало бы мне:

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

Могу ли я что-то изменить в приведенном выше примере запроса, чтобы разрешить это?

Ответы [ 2 ]

1 голос
/ 16 ноября 2011

Это зависит от того, что вы подразумеваете под «всеми строками, в которых было слово 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

Такое регулярное выражение не вернет "123 главная улица", если вы используете "23" вместо "lane" в предложении WHERE. Но это также не позволит вам запрашивать все адреса в блоке 2300 номеров Мейпл-стрит и номеров абонентских ящиков.

0 голосов
/ 16 ноября 2011

Полагаю, вы могли бы попробовать что-то вроде:

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 поддерживает это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...