Requête SQL - Utiliser comme si seulement si aucune correspondance exacte n'existe?

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

  •  09-06-2019
  •  | 
  •  

Question

Je rencontre un problème avec une requête qui utilise actuellement

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

Cependant, je découvre que j'en ai besoin pour l'utiliser uniquement s'il n'y a pas de correspondance exacte en premier. Ce qui se passe, c’est que la requête est un double dépouillement en raison de l’utilisation de LIKE . Par conséquent, s’il teste d’abord une correspondance exacte, il évitera le problème du double dépouillement. Quelqu'un peut-il me fournir des conseils supplémentaires?

Était-ce utile?

La solution

Il semble que vous souhaitiez joindre les tables avec un alias alias "pwd" et "ewd" dans votre extrait de code en s’appuyant d’abord sur une correspondance exacte. Si cela échoue, la comparaison est la même que celle que vous avez maintenant.

Essayez ceci:

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, '%'))

Ensuite, dans votre clause de sélection, utilisez quelque chose comme ceci:

select
  isnull(pwd1.field, pwd2.field)

Cependant, si vous traitez avec un champ qui peut être null dans pwd, cela posera des problèmes, cela devrait fonctionner:

select
  case pwd1.nonnullfield is null then pwd2.field else pwd1.field end

Vous devrez également vous assurer de créer un groupe, car la jointure à pwd2 ajoutera encore des lignes à votre jeu de résultats, même si vous finissez par ignorer les données qu'il contient.

Autres conseils

vous parlez de l'évaluation des courts-circuits.

Jetez un oeil à cet article, il pourrait vous aider: http://beingmarkcohen.com/?p=62

à l'aide de TSQL, exécutez une correspondance exacte, vérifiez le nombre de lignes == 0, si tel est le cas, exécutez la commande similaire, sinon ne l'exécutez pas et n'ajoutez pas les résultats similaires sous les correspondances exactes.

Je ne peux que penser à le faire en code. Recherchez une correspondance exacte. Si le résultat est vide, recherchez LIKE. Une autre option est un WHERE dans cette requête telle que WHERE ({nombre de correspondance exacte} = 0), auquel cas, la comparaison avec LIKE ne sera pas effectuée si la correspondance exacte renvoie plus de 0 résultats. Mais c’est terriblement inefficace ... sans oublier le fait que l’utiliser de manière significative dans le code est assez difficile.

Je choisirais un If (nombre de correspondance exacte = 0), puis la même requête, sinon utilisez simplement le résultat de la correspondance exacte.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top