2009-10-12 3 views
0

Я пытаюсь отфильтровать результаты в sql-запросе, используя аналогичный оператор. Вот результатыКак использовать SQL LIKE

/q/my_rat_terrior_is_about_8_just_this_moring_hes_barley_moving_around_panting_heavy_and_shaking_like_shivering/1 
/addquestion 
/addquestion/Validation 
/q/how_do_you_get_a_hamster_out_of_a_wall/2 

Это URL, которые хранятся в моей базе данных. Я хочу, чтобы соответствовать URLs как эти

/q/how_do_you_get_a_hamster_out_of_a_wall/2 
/q/my_rat_terrior_is_about_8_just_this_moring_hes_barley_moving_around_panting_heavy_and_shaking_like_shivering/1 

Это то, что я пробовал:

select * from MyURLs where MYuri LIKE '/q/' 

но его не возвращает никаких результатов. Любые идеи по этому поводу?

ответ

3

Вам нужно использовать% в качестве шаблона:

select * from MyURLs where MYuri LIKE '%/q/%' 

Это будет возвращать записи с «/ ц /» где-нибудь в поле. Если вы хотите, чтобы начать с «/ Q /», но есть что-нибудь после этого, вы будете использовать:

select * from MyURLs where MYuri LIKE '/q/%' 
+4

Будьте осторожны с такими фильтрами: ''%/q /% '', где есть дикая карта спереди фильтра. Это сломает индексы. –

2

Калеб уже дал вам решение (и Джоэл предупредил о производительности индекса в комментарии), но я Я хотел бы предложить другой маршрут, который будет хорошо масштабироваться. Если ваши таблицы никогда не будут очень большими, вы можете проигнорировать этот совет. Фактически, вы можете игнорировать его вплоть до того момента, когда вы ожидаете, что производительность пострадает (или производительность имеет фактически начал страдать) - это принцип YAGNI.

Базы данных почти всегда читать намного больше, чем они написаны. Это означает, что подходящее время для определения, когда URL-адрес начинается с или содержит «/ q /», когда данные помещаются в таблицу, не каждый раз, когда вы его извлекаете. Это амортизирует стоимость расчета (сделанного во время записи) во всех чтениях.

Для этого масштабируемого решения у вас должен быть отдельный столбец в таблице, например "startsWithQ" или "hasQ".

Затем с помощью триггера insert/update установите этот столбец на основе URL-адреса, помещенного в таблицу.

Тогда ваш запрос будет:

select * from MyURLs where hasQ = 'YES' 

и, если у вас есть индекс по этому колонку, ваши запросы будут кричать вместе.

Если вы действительно смотрите на большинство проблем с базой данных, они обычно «мой запрос не достаточно быстрый», а не «мой диск не достаточно большой». Как правило, оптимальным подходом является дисковое пространство на диске.

Этот может содержать, если вы используете строку поиска '/q/%'. Это должно быть профилировано, регулярно и в производстве - базы данных редко устанавливаются и забываются, поскольку производительность может измениться на основе данных в таблицах - измерение, не угадывайте.

Будет обязательно обеспечить улучшение, если строка поиска '%/q/%', если ваша база данных не является одним из тех редких животных, у которых больше записей, чем чтений.

+1

whoa..Это хорошая идея. Я буду использовать эту технику с другими решениями. Но то, что я действительно делаю, это чтение файла журнала iis, поэтому я бы вставлял любые данные. Но это хорошая идея для других решений. – Luke101

+0

Да, это очень хорошая идея, если вы знаете, какие поисковые запросы будут впереди, или иметь возможность ретроактивно изменять существующую таблицу. Я работал с довольно несколькими таблицами (обычно аудиторскими данными), где мне нужно искать определенный тип аудиторской записи, но я могу найти эти записи только с помощью LIKE в начале или в середине varchar ... talk о медленном запросе! Затем, эти системы получают LOT больше аудиторских вставок, чем получают запросы. Было бы интересно посмотреть, какова стоимость исполнения при выполнении LIKE для каждой вставки при 100 000 вставок в день. –

+1

Согласитесь, часть разработки базы данных создает необходимую структуру, так что вам никогда не придется искать, используя «% sometext%», – HLGEM

1

Если у вас много текста, создайте полнотекстовый каталог, создайте и заполните полнотекстовый индекс, а затем запросите полнотекстовые данные. его ключевые слова: содержит, freetext, containsstable, freetexttable. SQL Server 2005 и 2008 имеют мощный бесплатный текстовый поиск.