0
votes

Comment puis-je sélectionner des lignes avec la valeur de NO ou NULL lorsque le paramètre = 'NO' et des lignes avec la valeur de "oui" lorsque le paramètre = "oui"

J'ai besoin de sélectionner des lignes en fonction du paramètre '@hotlist'.

Quand '@hotlist' = 'Oui' J'ai besoin de tirer toutes les lignes où le champ "co.ro_hotlist" contient la valeur de "oui" Quand '@hotlist' = 'Non', j'ai besoin de tirer toutes les lignes où le champ "co.ro_hotlist" détient la valeur de 'NO' ou NULL

Je peux sélectionner les lignes où la valeur est "oui "Ou" non "juste basé sur le paramètre, mais ne peut pas comprendre comment sélectionner également les lignes NULL lorsque le paramètre est« non ». Comment puis-je modifier le code fourni pour y parvenir?

J'ai essayé d'utiliser une déclaration de cas dans la clause WHERE mais sans chance. xxx


1 commentaires

Y a-t-il une autre option en plus de Y n null?


4 Réponses :


1
votes

Essayez ceci dans le suivant:

ISNULL(co.ro_HotList,'No') = @HotList


3 commentaires

Cette déclaration réussirait-elle toujours le champ Co.ro_Hotlist si les valeurs sont «oui» ou «non»?


@Justinwade. Oui. Isnull évaluera l'expression comme valeur réelle que si elle est nulle, le résultat est la deuxième entrée.


La regroupement est une autre façon de le faire. La regroupement évalue la première valeur non nommée.



0
votes

Keith Réponse est la bonne, mais pour la complétude, vous mentionnez que vous essayez case et il faut faire comment utiliser en utilisant xxx .


0 commentaires

0
votes

Vous pouvez écrire la condition de filtrage comme indiqué ci-dessous:

SELECT ds.*                     
FROM Rotex_DailyShipmentNotShip ds
left outer join CRM_MSCRM..SalesOrder co ON ds.SOP#=co.Name 
WHERE @HotList = 'Yes' and co.ro_HotList = 'Yes'
   OR @HotList = 'No' and (co.ro_HotList = 'No' or co.ro_HotList is null)


2 commentaires

Vous avez probablement besoin de parenthèses à séparer ou à des conditions


@Juancarlosoropeza et a une priorité supérieure à celle de ou , il devrait donc fonctionner comme prévu. Cependant, je suis d'accord que cela pourrait être plus clair pour le lecteur occasionnel.



0
votes

Plusieurs réponses à la question de l'OP sont valides car elles renvoient les résultats escomptés, mais la plupart d'entre eux sont inefficaces car ils empêchent une utilisation appropriée de l'indice.

joint à des noms de colonne dans des expressions telles que des expressions ou des fonctions de case SQL d'utiliser index.

prédicats avec ou les conditions de l'opérateur et des paramètres empêchent également un plan d'exécution efficace.

Il existe plusieurs façons de construire la requête de manière efficace:

ajoutez une colonne calculée

Ajoutez une colonne calculée telle que:

alter Table Ajouter une hotliste comme ISnull (ro_hotlist, 'Non') < p> et indexer cela. La requête sera alors plus simple et expectorale:

où hotlist = @hotlist

Application client intelligente

L'application client pourrait être assez intelligent pour faire ce qui suit (pseudocode) xxx

Utilisez le lot T-SQL avec logique

au lieu d'exécuter un Énoncé unique de sélection, exécuté un lot avec logique xxx

Utilisez une procédure stockée

Vous pouvez créer une procédure stockée qui effectue la même logique que le deuxième lot de T-SQL précédant

option (recompilation)

Ajout d'option (recompiler)

Ajout d'une option (recompilation) à la réponse à l'impalaire conduit à de meilleurs plans d'exécution pouvant utiliser des index, mais empêche également la réutilisation du plan.

Les index non couverts de la sélectivité sont rarement utilisés.

Si une colonne contient peu de valeurs, un index non couvert est principalement inutile.

Dans ce cas, je pense que la colonne ne peut contenir que "oui", "non" ou NUL. Donc, indexer cela n'améliorerait pas les performances. Et la meilleure réponse est celle du Keithl's.


0 commentaires