2008-09-16 3 views
2

У меня возникли проблемы с запросом, который в настоящее время используетSQL Query - Использовать Как только если точное совпадение не существует?

LEFT JOIN weblog_data AS pwd 
    ON (pwd.field_id_41 != '' 
    AND pwd.field_id_41 LIKE CONCAT('%', ewd.field_id_32, '%')) 

Однако я обнаружил, что мне это нужно, чтобы использовать только, что, если нет точного соответствия первым. Что происходит, так это то, что запрос является двойным погружением из-за использования LIKE, поэтому, если он сначала проверяет точное совпадение, тогда он избежит проблемы с двойным окунанием. Может ли кто-нибудь предоставить мне какие-либо дополнительные указания?

ответ

1

Похоже, вы хотите присоединиться к таблицам с псевдонимом как pwd и ewd в своем фрагменте, основанном сначала на точном совпадении, и если это не удастся, то на подобном сравнении у вас есть.

Попробуйте это:

LEFT JOIN weblog_data AS pwd1 ON (pwd.field_id_41 != '' AND pwd.field_id_41 = ewd.field_id_32) 
LEFT JOIN weblog_data AS pwd2 ON (pwd.field_id_41 != '' AND pwd.field_id_41 LIKE CONCAT('%', ewd.field_id_32, '%')) 

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

select 
    isnull(pwd1.field, pwd2.field) 

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

select 
    case pwd1.nonnullfield is null then pwd2.field else pwd1.field end 

Вам также необходимо обязательно выполнить группу, так как join to pwd2 все равно добавит строки в ваш результирующий набор, даже если вы проигнорируете данные в нем.

1

Вы говорите об оценке короткого замыкания.

Посмотрите на эту статью, это может помочь вам: http://beingmarkcohen.com/?p=62

+0

Я не понимаю, как это выполняет то, что я ищу. Из примеров видно, что SQL является достаточно умным, чтобы избежать лишних циклов по бессмысленным запросам. Это похоже на то, что если A или B, а A истинно, то он движется дальше. Мне нужно, чтобы он делал A, если A терпит неудачу, делайте B. – 2008-09-16 19:22:03

1

с помощью TSQL, запустить точное совпадение, проверьте Количество строк == 0, если да, то запустить, как, в противном случае не запускайте например, или добавить похожие результаты ниже точных совпадений.

0

Я могу только думать о том, чтобы делать это в коде. Найдите точное соответствие, если результат пуст, найдите LIKE. Другим вариантом является WHERE в этом запросе, так что WHERE ({count from exact match} = 0), и в этом случае он не будет проходить сравнение с LIKE, если точное совпадение возвращает более 0 результатов. Но его ужасно неэффективно ... не говоря уже о том, что использование этого смысла в коде довольно сложно.

Я бы пошел за a If (count from exact match = 0), тогда сделайте запрос, иначе просто используйте результат из точного соответствия.

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

  • Нет связанных вопросов^_^