Consulta SQL - Use Like somente se não existir uma correspondência exata?
Pergunta
Estou tendo um problema com uma consulta que usa atualmente
LEFT JOIN weblog_data AS pwd
ON (pwd.field_id_41 != ''
AND pwd.field_id_41 LIKE CONCAT('%', ewd.field_id_32, '%'))
No entanto, estou descobrindo que preciso usar isso apenas se não houver uma correspondência exata primeiro.O que está acontecendo é que a consulta está caindo duas vezes devido ao uso de LIKE
, portanto, se ele testar primeiro uma correspondência exata, evitará o problema de imersão dupla.Alguém pode me fornecer mais alguma orientação?
Solução
Parece que você deseja juntar as tabelas com alias pwd e ewd em seu snippet com base primeiro em uma correspondência exata e, se isso falhar, na comparação semelhante que você tem agora.
Experimente isto:
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, '%'))
Então, na sua cláusula select, use algo assim:
select
isnull(pwd1.field, pwd2.field)
no entanto, se você estiver lidando com um campo que pode ser nulo em pwd, isso causará problemas, mas isso deve funcionar:
select
case pwd1.nonnullfield is null then pwd2.field else pwd1.field end
Você também terá que fazer um group by, pois a junção com pwd2 ainda adicionará linhas ao seu conjunto de resultados, mesmo se você acabar ignorando os dados nele.
Outras dicas
você está falando sobre avaliação de curto-circuito.
Dê uma olhada neste artigo que pode te ajudar:http://beingmarkcohen.com/?p=62
usando TSQL, execute uma correspondência exata, verifique o número de linhas == 0, em caso afirmativo, execute semelhante, caso contrário, não execute semelhante ou adicione resultados semelhantes abaixo das correspondências exatas.
Só consigo pensar em fazer isso em código.Procure uma correspondência exata, se o resultado estiver vazio, procure um LIKE.Uma outra opção é um WHERE dentro desta consulta tal que WHERE ({count from exact match}=0), caso em que não passará pela comparação com LIKE se a correspondência exata retornar mais de 0 resultados.Mas é terrivelmente ineficiente...sem mencionar o fato de que usá-lo de forma significativa no código é bastante difícil.
eu escolheria um If(count from exact match = 0) e faria a mesma consulta, caso contrário, basta usar o resultado da correspondência exata.