0
votes

Exclusion d'enregistrements en fonction de plusieurs critères avec des valeurs spécifiques dans deux colonnes

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:

  • Exclure la ligne où la cellule du magasin 2 est nulle. Même si le magasin 1 n'est pas nul, excluez quand même cette ligne en fonction du fait que le magasin 2 est nul.
  • Exclure la ligne où les cellules du magasin 1 et du magasin 2 sont toutes deux «numériques». Pour tout enregistrement comportant "Numérique" pour le magasin 1 ET le magasin 2, excluez-le.
  • Exclure la ligne où les cellules du magasin 1 et du magasin 2 sont toutes les deux "Null". Pour les lignes où Store 1 et Store 2 sont nulles pour le même enregistrement, excluez-le.

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.


1 commentaires

Je ne vois pas de store_3 ici


3 Réponses :


0
votes

Cet eill le faire: xxx


0 commentaires

2
votes

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

Démo sur dbfiddle


4 commentaires

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)



0
votes

@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é


0 commentaires