Je veux avoir une instruction SELECT qui prend un paramètre de table des identifiants. Le comportement souhaité est que s'il n'y a pas d'éléments dans la table, obtenez toutes les valeurs, mais s'il y a des éléments dans la table, sélectionnez uniquement les valeurs qui correspondent au paramètre ID de la table.
mon Cependant, le résultat ramène toujours tous les emplacements, même lorsque la table EmplacementInds contient une valeur et que l'ID ne correspond qu'une seule valeur. < / p> Je peux définir les valeurs telles que, mais elle ramène toujours tous les emplacements: p> où < / Code> La clause ressemble à ceci: p>
3 Réponses :
Essayez ceci:
SELECT *
FROM BLAH
WHERE [TransactionDateTime] BETWEEN @BeginTransDate AND @EndTransDate
AND (
(SELECT COUNT(ID) FROM @LocationIds) = 0
OR
ID in (SELECT ID FROM @LocationIds)
)
Certaines explications de votre code amélioreraient grandement votre réponse.
Il vous manque des supports de paire.
SELECT b.* FROM BLAH b LEFT JOIN @LocationIds l ON l.ID = b.LocationId
Le rejoindre code> retournerait à chaque rangée dans bla code>, peu importe s'il y avait une ligne correspondante dans @LOCATIONIDS code>; Ce n'est pas ce que l'OP est après.
Personnellement, je fais cela sous la forme de 2 questions, car le plan de requête pour quand il y a des lignes dans @LOCALYIDS code> et est susceptible de différer suffisamment que la réutilisation du plan ne soit pas bénéfique pour le Autre, donc vous obtenez: WHERE TransactionDateTime >= @BeginTransDate
AND TransactionDateTime < DATEADD(DAY, 1, @EndTransDate)
Si (Sélectionnez Count (*) à partir de @LOCALITYIDS) = 0 code> n'a pas besoin d'un compte précis, s'il n'existe pas (sélectionnez 42 à partir de @LOCALITYIDS) CODE> suffirait. (Laissant tomber le pas code> et qui acheminez les requêtes serait un peu plus clair.)
Vrai @habo. Avec une table avec cela, il risque d'être marginal sur la performance, le cas échéant, mais je suis d'accord n'existe pas code> serait probablement un meilleur choix.