J'ai une table avec trois colonnes: Book, Store_1 et Store_2. J'utilise MS Access, mais je connais également MySQL.
SELECT * FROM Books WHERE (Store_2 IS NULL) OR (Store_1 AND Store_2 = "Digital") OR (Store_1 AND Store_2 IS NULL) ;
Problème
Je dois écrire une seule requête qui exclura une ligne si elle répond à l'un des critères suivants:
Le tableau devrait ressembler à ceci après l'exécution de la requête:
_______________________________________________ Book | Store_1 | Store_2 | Spines | | Paper | Grapes of Wrath | | Digital | Redwall | Paper | Paper | Perloo the Bold | Digital | Paper | _______________________________________________
Ce que j'ai essayé
Je vais être honnête et dire que je ne sais pas comment combiner les trois critères en une seule déclaration. Le plus proche que j'ai ... est d'obtenir le contraire de ce que je veux , c'est-à-dire avec ceci:
_______________________________________________ Book | Store_1 | Store_2 | Lord of the Rings | Paper | | Ender's Game | Digital | Digital | Mistborn | Digital | | Spines | | Paper | Grapes of Wrath | | Digital | Artemis Fowl | | | Redwall | Paper | Paper | Perloo the Bold | Digital | Paper | _______________________________________________
Cela me donne les livres Je ne veux pas , ce qui est un début, mais je ne sais pas comment inverser la tendance. J'obtiens une erreur de syntaxe lors de l'ajout de NOT IN après WHERE. Merci pour toute aide, conseil ou orientation sur la bonne voie que vous pouvez fournir.
3 Réponses :
Cet eill le faire:
Votre deuxième condition NULL
est superflue car elle ne peut être vraie que si la première est vraie. Vous pouvez donc simplifier votre expression en:
Book Store_1 Store_2 Spines Paper Grapes of Wrath Digital Redwall Paper Paper Perloo the Bold Digital Paper
Sortie:
SELECT * FROM Books WHERE Store_2 IS NOT NULL AND NOT (Store_2 <=> 'Digital' AND Store_1 <=> 'Digital')
Merci de prendre le temps de répondre. Essayer votre solution a renvoyé les lignes pour "Le Seigneur des Anneaux" et "Le Jeu d'Ender". J'ai réalisé que j'aurais dû être plus clair sur mes critères d'exclusion. - Exclure la ligne où les cellules du magasin 1 et du magasin 2 sont toutes les deux «numériques». Je voulais dire exclure les enregistrements où les DEUX cellules sont «numériques» en même temps. - Exclure la ligne où la cellule du magasin 1 et du magasin 2 sont toutes les deux "Null". Encore une fois, excluez les enregistrements où les cellules Store 1 et Store 2 sont «Null» pour un seul enregistrement.
@ user12475155 mon mauvais - j'ai oublié d'autoriser les comparaisons NULL-safe. J'ai mis à jour la requête et ajouté une démo fonctionnelle. Pardon...
Nick, vous ne connaissez pas l'opérateur null-safe égal à dans Access, n'est-ce pas? Je sais que je dis que je connais MySQL aussi, mais malheureusement je ne l'ai jamais utilisé et je ne trouve rien en ligne sur la façon de le traduire en Access. À part cela, votre requête se lit correctement et je comprends où je me suis trompé.
@ user12475155 Je ne pense pas que l'accès en ait un. Vous devrez utiliser WHERE Store_2 IS NOT NULL AND NOT (Store_2 = 'Digital' AND Store_2 IS NOT NULL AND Store_1 = 'Digital' AND Store_1 IS NOT NULL)
@zip était proche, mais a un backtick caché dans le deuxième Store_1 IS NOT NULL
et la comparaison de sécurité nulle pour tous les magasins non égaux à 'digital' ou NULL, consiste à vérifier Store_1
pour Null, car Store_2 ne peut pas être Null, en raison du premier critère.
Désormais, si l'un de ces critères est rempli, les données sont affichées.
SELECT * FROM Books WHERE Store_2 IS NOT NULL AND ( Store_1 <> 'Digital' OR Store_2 <> 'Digital' OR Store_1 IS NOT NULL );
Les erreurs courantes avec Null peuvent éclairer OP sur l'obtention de null-safe dans Ms Access
.
Une dernière remarque.
Les noms de champ avec un nombre (en particulier dans l'ordre), sentent comme une mauvaise normalisation. Habituellement, vous auriez une colonne pour le numéro de magasin, ce qui vous rend libre d'avoir un nombre illimité de magasins.
Pour afficher plus tard les données avec le numéro de magasin dans les colonnes, vous pouvez créer une requête de tableau croisé
Je ne vois pas de store_3 ici