2016-02-16 4 views
-1

У меня есть простой запрос, где я хочу, чтобы получить все строки со словом «X5Mdr2» и «» y4M2raКак найти «слова» в строке с SQL

select id from airPort where dest_name like '%X5Mdr2%' and dest_name like '%y4M2ra%'; 

отл. Таблица: AIRPORT

id | dest_name           | desc | ... 
1 | .. <abcd> *X5Mdr2* </abcd> 28372 X5529 <*y4M2ra*> .. | .. | 
2 | asdajsdjasdjasdja         | .. | 
3 | .. <wxyz> *X5Mdr2* </wxyz> 23812 X5529 <*y4M2ra*> .. | .. | 

...

должен возвращать идентификатор: 1, 3

Как я могу добиться этого?

+1

Вы сохраняете почтовый индекс в том же поле для адреса улицы? Это звучит как плохой дизайн базы данных, если вы храните их все в одном поле. – Siyual

+0

Является ли ваш 'ex' примером всех строк? Или это строки, которые вы хотите? Потому что у второго нет zip, который начинается с 142. – Schwern

+1

Если вам нужно запросить zip, введите его в свой собственный столбец. –

ответ

2

[Примечание: Вопрос был отредактирован другой вопрос, а я отвечал]

Вы очень близки. Есть несколько небольших недостатков. Но, к сожалению, это никогда не сработает.


Предположительно вы хотите, чтобы соответствовать «123 Main St» и «123 Main St», так что вам нужно сделать дело матч бесчувственно. Вы можете добиться этого, используя lower() на address и убедившись, что все буквы в вашем матче также строчные.

lower(address) like '%main st%' 

Тогда есть проблема почтовый индекс. Прямо сейчас вы соглашаетесь с чем-то, у кого есть 142. Вам нужны только вещи, которые начинают с 142, вы не хотите 12142 или 31429. Так что добавьте пробел в начало вашего матча.

address like '% 142%' 

Поиск по названию улицы также может использовать эту обработку, чтобы избежать сбора «Жермен-стрит».


Собираем все вместе ...

SELECT * 
FROM customer 
WHERE lower(address) like '% main st%' AND 
     address like '% 142%'; 

Это работает только в определенной степени. Например, он заберет 123 Main St Apt 142, NY, NY 10005, потому что он просто ищет номер 142. Или что, если они используют запятую вместо пространства для отделения почтового индекса от состояния? 123 Main St,NY,NY,14205 Тогда вы не будете соответствовать почтовому индексу.

Если вы используете базу данных, которая поддерживает регулярные выражения, вы можете улучшить соответствие некоторым, но это никогда не будет на 100%. И чем сложнее ваше соответствие, тем меньше вероятность того, что база данных сможет использовать индексы, ей придется выполнять полное сканирование таблицы каждый раз.

Чтобы решить проблему, вам придется предварительно разобрать свои адреса, разбить их на свои компоненты и сохранить их. Это сложная и сложная проблема. К счастью, для этого существует множество библиотек, но это зависит от языка, который вы используете. Это другой вопрос.

+0

ваш ответ в порядке, я просто хотел знать, будет ли это работать с большой строкой, содержащей несколько небольших подстрок – logger

-2

Какую цель вы ставите перед собой? Чтобы иметь в поле адрес «главная ст» или «142»?

В этом случае вы должны написать:

select * from customer where address like '%main st%' or address like '%142%'; 

Или иметь оба из них?

В таком случае ваш запрос должен работать уже.

+1

Это будет лучше, чем комментарий. – Schwern

+0

Да, я хотел прокомментировать, теперь я вижу, что я сделал. Я новичок здесь, спасибо за совет :) – Borko

Смежные вопросы