Je travaille sur une procédure stockée et, à un moment donné, je veux vérifier ma variable de table pour voir s'il n'y a pas exactement zéro lignes avec un champ spécifique nul. En d'autres termes, pour chaque ligne de ma table, ce champ a une valeur non nulle. Je ne voudrais pas le faire en vérifiant count(), mais en utilisant EXISTS.SQL: vérifier si une table ne contient aucune valeur nulle dans une colonne particulière
Actuellement, je fais ceci:
IF EXISTS (SELECT * FROM @sometable where somefield IS NULL)
SET @somefield = @somefield /* just a way to skip this */
ELSE
/* perform some logic */
Maintenant, je sais que je peux utiliser PAS EXISTE, mais je suppose un pas EXISTE est beaucoup plus lent que EXISTS. Je jure que j'ai lu quelque chose récemment (sur SO je pense) qui avait un exemple de comment faire ce que je veux faire avec une clause Exists mais je ne peux pas le trouver et j'ai négligé de le mettre en signet. Bien que je me trompe peut-être. La raison pour laquelle je configure un if/else est que, d'après ce que j'ai compris, EXISTS retournera avant un NOT EXISTS et comme il s'agit d'une procédure stockée assez intensive (appelée assez fréquemment et parfois en masse), j'espère pouvoir en sauver traitement ici. Peut-être que je regarde tout faux ou suppose quelque chose de façon incorrecte. Je suis ici pour apprendre alors pointez-moi dans la bonne direction si j'ai tout faux.
Éditer: Apparemment il n'y a pas de différence dans ce contexte (ne faisant pas partie d'une clause where/sous-requête). Mais supposons que j'UTILISE existe dans une clause where et que je voulais vérifier le scénario exact ci-dessus (TOUTES les valeurs non nulles dans un champ) en particulier quand la table en question pourrait potentiellement avoir des milliers de lignes. [sorte de nouveau à SO, si je devrais le signaler comme sa propre question, s'il vous plaît faites le moi savoir]
Un ** ** toutes les valeurs non nulles vérifient dans la clause where d'une requête principale est essentiellement le même contexte, puisqu'il ne sera exécuté qu'une seule fois par requête. Une vérification de toutes les valeurs non nulles dans une sous-requête est une très mauvaise idée, car elle nécessitera un balayage de table de la table concernée chaque fois que la sous-requête est exécutée. –