SQL-запрос - использовать Like только в том случае, если точного совпадения не существует?
Вопрос
У меня возникла проблема с запросом, который в данный момент использует
LEFT JOIN weblog_data AS pwd
ON (pwd.field_id_41 != ''
AND pwd.field_id_41 LIKE CONCAT('%', ewd.field_id_32, '%'))
Однако я обнаруживаю, что мне нужно использовать это только в том случае, если сначала нет точного совпадения.Что происходит, так это то, что запрос выполняется с двойным погружением из-за использования LIKE
, поэтому, если он сначала проверит точное совпадение, это позволит избежать проблемы двойного погружения.Кто-нибудь может дать мне какие-либо дополнительные рекомендации?
Решение
Похоже, вы хотите объединить таблицы с псевдонимами 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 используйте что-то вроде этого:
select
isnull(pwd1.field, pwd2.field)
однако, если вы имеете дело с полем, которое может быть нулевым в pwd, это вызовет проблемы, хотя это должно сработать:
select
case pwd1.nonnullfield is null then pwd2.field else pwd1.field end
Вам также нужно будет обязательно выполнить group by , так как соединение с pwd2 все равно добавит строки в ваш результирующий набор, даже если вы в конечном итоге проигнорируете содержащиеся в нем данные.
Другие советы
вы говорите об оценке короткого замыкания.
Взгляните на эту статью, возможно, она вам поможет:http://beingmarkcohen.com/?p=62
используя TSQL, запустите точное совпадение, проверьте количество строк == 0, если это так, запустите подобное, в противном случае не запускайте подобное или добавьте подобные результаты под точными совпадениями.
Я могу думать только о том, чтобы сделать это в коде.Ищите точное совпадение, если результат пустой, ищите ЛАЙК.Другим вариантом является WHERE в этом запросе, такой, что WHERE ({count from exact match}=0), в этом случае сравнение с LIKE не будет выполняться, если точное совпадение возвращает более 0 результатов.Но это ужасно неэффективно...не говоря уже о том факте, что осмысленно использовать его в коде довольно сложно.
я бы выбрал If(count from exact match = 0), затем выполнил подобный запрос, иначе просто использовал результат exact match.