web-dev-qa-db-ja.com

値がnullのInfluxDBから選択

私のデータ(概念的に)が:

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

次に、レガシーSQL言語では、ステートメントは次のようになります。

select * from table where b is null

InfluxDBクエリ言語のドキュメントで同様の条件を見つけることができません。

列にオプションで数値があるデータを使用していて、この列が空/ nullであるレコードを選択したい。これらは整数であるため、一致する正規表現ではまったく機能しないように見えるため、where !~ /.*/のようなものが出てきます。

16
glasnt
8
glasnt

InfluxDBはNULLを理解せず、クエリでis nullまたはis not nullを使用するとエラーが表示されます。 nullのようなものを見つけるには、空のスペースを探す必要があります。つまり、空の単一引用符を次のように使用します。

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

少なくとも1つの「無効な」値(たとえば、バイト単位の負のサイズ)が存在するフィールドの場合、格納されているデータを変更せずに、欠落データのある行を検索できるクエリを作成できます。

macwin、_win64_、linux、_linux64_の5つのフィールドを持つメトリックがありますが、すべてのフィールドに行があり、その時点で利用可能なデータがないため、行が追加されない場合があります。

最初に、無効な値に設定されたfill()句を使用してデータをクエリすることにより、サブクエリで_-1_を外側のクエリにラップして、少なくとも1つの列が欠落している行を見つけることができます。 (OR式間でWHEREを使用)またはまったくデータのない行(AND式間でWHEREを使用)。

サブクエリは次のようになります。

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

これにより、各フィールドに返される値として、_1_(その日のそのフィールドの出現回数)または_-1_(欠落)を含むすべての行(1日に1つ)が得られます。

次に、次のような外部クエリを使用して、そこからデータがない行を選択できます(この場合、返されるフィールドはすべて-1であり、したがって興味のないものであり、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;

または、次のように少なくとも1つのフィールドが欠落している行を選択できます。

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;

ただし、まだ改善の余地があります。外部クエリでフィールド名を手動で指定する必要がありますが、_WHERE * = -1_などのほうがはるかに優れています。また、データのサイズによっては、このクエリはSLOOOOOOWになり、ネストされたクエリを使用すると、時間によるフィルタリングは非常に混乱します。明らかに、influxの人々が_is null_または_not null_またはいくつかの同様の構文をinfluxqlに追加したほうがいいのですが、上でリンクされているように、そうすることにあまり興味がないようです。

0
Camden Narzt