Как использовать SQL LIKE - PullRequest
       13

Как использовать SQL LIKE

0 голосов
/ 12 октября 2009

Я пытаюсь отфильтровать результаты в запросе 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, которые хранятся в моей базе данных. Я хочу сопоставить URL-адреса вот так

/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 ]

3 голосов
/ 12 октября 2009

Вам необходимо использовать% в качестве подстановочного знака:

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

Это вернет записи с '/ q /' в любом месте поля. Если вы хотите, чтобы он начинался с '/ q /', но после этого было что-то, вы должны использовать:

select * from MyURLs where MYuri LIKE '/q/%'
2 голосов
/ 12 октября 2009

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

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

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

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

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

select * from MyURLs where hasQ = 'YES'

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

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

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

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

1 голос
/ 12 октября 2009

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

...