web-dev-qa-db-fra.com

sélectionner dans InfluxDB où la valeur est null

Si mes données (conceptuellement) sont: 

#  a b c 
  -------
1  1   1
2  1 1 0
3  1 0 1

Ensuite, dans le langage SQL hérité, l'instruction serait: 

select * from table where b is null

Je ne trouve pas de condition similaire dans la documentation InfluxDB Query Language. 

Je travaille avec des données pour lesquelles il existe éventuellement une valeur numérique dans une colonne et je souhaite sélectionner les enregistrements dans lesquels cette colonne est vide/nulle. Comme il s’agit de nombres entiers, ils ne semblent pas fonctionner du tout avec les expressions rationnelles correspondantes, de sorte que quelque chose comme where !~ /.*/ est sorti. 

14
glasnt
6
glasnt

InfluxDB ne comprend pas NULL et affichera une erreur si vous utilisez is null ou is not null dans la requête. Pour trouver quelque chose qui ressemble à null, nous devons rechercher un espace vide, c’est-à-dire utiliser des guillemets simples vides comme 

SELECT * FROM service_detail where username != ''
8
Avis

Pour les champs où il existe au moins une valeur "non valide" (par exemple, une taille négative en octets), vous pouvez créer une requête permettant de rechercher des lignes contenant des données manquantes sans modifier les données stockées.

J'ai une métrique avec 5 champs: mac, win, win64, linux et linux64, tous les champs ne sont pas renseignés dans toutes les lignes et, à l'occasion, aucune ligne ne sera ajoutée car aucune donnée n'est disponible pour le moment.

En interrogeant d'abord les données avec une clause fill() définie sur ma valeur non valide: -1 dans une sous-requête, je peux ensuite l'envelopper dans une requête externe pour rechercher les lignes manquantes d'au moins une colonne (à l'aide de OR entre __ expressionsWHERE) ou de lignes avec pas de données du tout (en utilisant AND entre WHERE expressions).

La sous-requête ressemble à ceci: 

SELECT count(*) FROM "firefox" GROUP BY time(1d) fill(-1)

Cela me donne toutes mes lignes (il y en a une par jour) avec un 1 (le nombre d'occurrences de ce champ pour la journée) ou un -1 (manquant) en tant que valeur renvoyée pour chaque champ.

Je peux ensuite choisir les lignes qui ne contiennent aucune donnée avec une requête externe comme celle-ci (remarque: dans ce cas, les champs renvoyés sont tous -1 et donc sans intérêt et peuvent être masqués dans votre visualiseur, comme Grafana):

SELECT * from (_INNER_QUERY_HERE_) WHERE count_linux = -1 AND count_linux64 = -1 AND count_mac = -1 AND count_win = -1 AND count_win64 = -1;

Ou je peux choisir des lignes avec au moins un champ manquant comme ceci:

SELECT * from (_INNER_QUERY_HERE_) WHERE count_linux = -1 OR count_linux64 = -1 OR count_mac = -1 OR count_win = -1 OR count_win64 = -1;

Il y a encore place à l'amélioration, vous devez spécifier manuellement les noms de champs dans la requête externe, alors que quelque chose comme WHERE * = -1 serait beaucoup plus agréable. En outre, en fonction de la taille de vos données, cette requête sera SLOOOOOOW et le filtrage temporel est très déroutant lorsque vous utilisez des requêtes imbriquées. Évidemment, il serait préférable que les membres de influx viennent d'ajouter is null ou not null ou une syntaxe similaire à influxql, mais comme cela a été lié ci-dessus, ils ne semblent pas trop intéressés à le faire.

0
Camden Narzt