0
votes

Voulait choisir parmi une table mais ça l'ignore

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 où < / Code> La clause ressemble à ceci: xxx

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: xxx


0 commentaires

3 Réponses :


1
votes

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)
     )


1 commentaires

Certaines explications de votre code amélioreraient grandement votre réponse.



1
votes

Il vous manque des supports de paire.

SELECT b.*
FROM BLAH b
LEFT JOIN @LocationIds l ON l.ID = b.LocationId


1 commentaires

Le rejoindre retournerait à chaque rangée dans bla , peu importe s'il y avait une ligne correspondante dans @LOCATIONIDS ; Ce n'est pas ce que l'OP est après.



2
votes

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)


2 commentaires

Si (Sélectionnez Count (*) à partir de @LOCALITYIDS) = 0 n'a pas besoin d'un compte précis, s'il n'existe pas (sélectionnez 42 à partir de @LOCALITYIDS) suffirait. (Laissant tomber le pas 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 serait probablement un meilleur choix.