如果我的数据(概念上)是:
# a b c
-------
1 1 1
2 1 1 0
3 1 0 1
然后在旧版 SQL 语言中,语句将是:
select * from table where b is null
我在 InfluxDB 查询语言文档中找不到类似的情况。
我正在处理列中可选数值的数据,并且我想选择该列为空/空的记录。由于这些是整数,它们似乎根本不适用于匹配的正则表达式,所以类似的东西where !~ /.*/
已经出来了。
如果我的数据(概念上)是:
# a b c
-------
1 1 1
2 1 1 0
3 1 0 1
然后在旧版 SQL 语言中,语句将是:
select * from table where b is null
我在 InfluxDB 查询语言文档中找不到类似的情况。
我正在处理列中可选数值的数据,并且我想选择该列为空/空的记录。由于这些是整数,它们似乎根本不适用于匹配的正则表达式,所以类似的东西where !~ /.*/
已经出来了。
InfluxDB 不理解,如果在查询中使用或NULL
将显示错误。为了找到类似于 null 的东西,我们需要寻找空白空间,即使用空单引号作为is null
is not null
SELECT * FROM service_detail where username != ''
对于至少存在一个“无效”值的字段(例如,以字节为单位的负大小),您可以创建一个查询,该查询允许您查找缺少数据的行,而无需修改存储的数据。
我有一个包含 5 个字段的指标:mac
、win
、win64
、linux
和linux64
,并不是每行都填写了每个字段,有时由于当时没有可用数据,因此不会添加一行。
通过首先使用fill()
设置为我的无效值的子句查询数据:-1
在子查询中,然后我可以将其包装在外部查询中以查找缺少至少一列的行(在表达式OR
之间使用)或根本没有数据的行WHERE
(在表达式AND
之间使用)。WHERE
子查询如下所示:
SELECT count(*) FROM "firefox" GROUP BY time(1d) fill(-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;
或者我可以选择至少有一个缺失字段的行,如下所示:
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 会更好,但正如上面链接的那样,他们似乎对此不太感兴趣。
在 OSS 2.0 的 Flux 查询中,我遇到了同样的问题 -> 无法搜索“null”标签步骤:
|> filter(fn: (r) => r["_measurement"] == "my_measurement" and r.my_tag == null)
=> 错误
|> filter(fn: (r) => r["_measurement"] == "my_measurement" and r.my_tag == "")
=> 你没有得到任何结果
|> filter(fn: (r) => r["_measurement"] == "my_measurement" and r.my_tag =~ /^$/)
=> 它有效!