Consulta SQL - Use Like somente se não existir uma correspondência exata?

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

  •  09-06-2019
  •  | 
  •  

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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top