SQL-запрос - использовать Like, только если точное совпадение не существует? - PullRequest
2 голосов
/ 16 сентября 2008

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

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

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

Ответы [ 4 ]

1 голос
/ 16 сентября 2008

Звучит так, как будто вы хотите объединить таблицы с псевдонимами 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

Вы также должны убедиться, что группа создана, поскольку объединение с pwd2 все равно добавит строки в ваш набор результатов, даже если вы в конечном итоге проигнорируете данные в нем.

1 голос
/ 16 сентября 2008

используя TSQL, запустите точное совпадение, проверьте количество строк == 0, если это так, запустите подобное, иначе не запускайте подобное или не добавляйте аналогичные результаты ниже точных совпадений.

1 голос
/ 16 сентября 2008

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

Взгляните на эту статью, она может вам помочь: http://beingmarkcohen.com/?p=62

0 голосов
/ 16 сентября 2008

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

Я бы пошел на If (количество от точного совпадения = 0), затем сделал бы запрос, иначе просто использовал бы результат от точного совпадения.

...