SQL-запрос - использовать Like только в том случае, если точного совпадения не существует?

StackOverflow https://stackoverflow.com/questions/75819

  •  09-06-2019
  •  | 
  •  

Вопрос

У меня возникла проблема с запросом, который в данный момент использует

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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top