web-dev-qa-db-fra.com

La sélection de requête où n'est pas null vs <> '' ne filtre pas correctement

J'ai un problème avec ma requête où j'ai des cellules numériques et des cellules de texte qui, si toutes sont vides, je ne souhaite pas les récupérer. Toutefois, si l'une des cellules n'est pas vide, je souhaite extraire cette ligne.

Je sais que is not Null est utilisé pour les cellules numériques et <>'' pour les cellules de texte.

Par exemple:

Disons que la table ressemble à ceci dans la table de données d'origine. La feuille s'appelle 'Data'.

             Column    |   A    |   B   |  C     |  D    |
             Cell Type | Number | Text  | Number | Text  |
             Row1      |  7     | Stuff |  5.33  | Sweet |
             Row2      |  8     | World |        | Hello |
             Row3      |  9     |       |        |       |
             Row4      |        |       |        |       |
             Row5      |        |       |  9.77  |       |

Je veux être capable de saisir toutes les lignes sauf Row4

Si j'utilise cette requête, cela devrait fonctionner correctement avec les types de cellules. Correct?

=Query(Data!A:D, Select D,B,A,C Where A Is Not Null OR B <>'' OR C Is Not Null OR D <>'')

J'ai appliqué cela à mon exemple de feuille de calcul qui utilise les mêmes principes que cette requête. Sauf que cela ne fonctionne que sur deux de mes feuilles. Les feuilles qui n'ont pas beaucoup de données à sélectionner; la requête ne saisit que les en-têtes. Dans mon esprit, pour le deuxième onglet appelé DonSmithPool, il devrait saisir quelques-unes des lignes contenant des commentaires de texte et pour le dernier onglet appelé TeachPool, il devrait saisir une rangée.

exemple de feuille de calcul

4
CamSyl

la requête ne saisit que les en-têtes.

Non, il saisit également quelques lignes. Faites défiler ... chemin, chemin en bas. Ils sont là. Voici pourquoi vous frappez ceci.

  1. Certaines de vos colonnes sont complètement vides. Ceux-ci sont interprétés comme chaîne par défaut. Par conséquent, is not null est toujours vrai pour ceux-ci et vous obtenez la table entière.
  2. Etant donné que vous commandez par B (croissant par défaut), le nombre considérable de lignes vides se retrouve en haut de la liste et vous amène à conclure que la requête ne renvoie rien.

Malheureusement, il semble n'y avoir aucun moyen de déclarer le type d'une colonne vide. Ceci, combiné au comportement "no nulls in string column", conduit à des personnes étant rendu fou par not null .

Pour garder votre santé mentale, soit

  • assurez-vous que chaque colonne a au moins une cellule non vide, avec une valeur du type que vous attendez dans cette colonne.
  • ou bien utilisez la commande moins puissante mais plus simple filter quand elle suffit pour la tâche. Notez que la sortie du filtre peut être introduite dans une requête afin de combiner les meilleures fonctionnalités des deux.
5
user79865