问题 从InfluxDB中选择value为null


如果我的数据(概念上)是:

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

然后在遗留SQL语言中,语句将是:

select * from table where b is null

我在InfluxDB查询语言文档中找不到类似的条件。

我正在使用数据,其中列中有可选的数值,我想选择此列为空/空的记录。由于这些是整数,它们似乎根本不适用于匹配的正则表达式,所以类似于 where !~ /.*/ 出去了。


11163
2018-05-07 04:32


起源

它仍然是 不可能在InfluxDB中搜索NULL。 - Dan Dascalescu


答案:


InfluxDB不理解NULL,如果在查询中使用“is null”或“is not null”,则会显示错误。为了找到类似于null的东西,我们需要寻找空的空间,即使用空的单引号

SELECT * FROM service_detail where username != ''

5
2017-09-27 11:07



这适用于搜索 非-NULL值。要搜索NULL,你不能说 username = '',因为那是空字符串,不同于那个根本没有值的字段。 - Dan Dascalescu
@DanDascalescu你说的是真的 领域。但是,对于 标签做的 WHERE some_tag = ''  将 匹配标记没有值的行。 (标签值仍将返回为 null 在JSON的响应中 /query 但是,API不是空字符串,因为内部一致的类型系统适用于三色紫罗兰。) - Mark Amery
伙计们,我的答案是@glasnt所说的内容的延伸,请理解上下文,然后判断有助于解决问题的答案。 - Avis


您无法搜索空值 在InfluxDB <0.9。您 将无法插入空值 在Influx> = 0.9


4
2018-05-08 03:37



虽然你不能再在InfluxDB中插入空值, 查询仍然返回空值,但你无法查询 通过 null(例如,IS NULL或IS NOT NULL)。 - Dan Dascalescu


对于存在至少一个“无效”值的字段(例如,以字节为单位的负大小),您可以创建一个查询,该查询允许您查找缺少数据的行,而无需修改存储的数据。

我有一个包含5个字段的指标: macwinwin64linux,和 linux64,并非每一个字段都填写在每一行中,有时不会添加一行,因为它当时没有可用的数据。

首先用a查询数据 fill() 子句设置为我的无效值: -1 在子查询中,我可以将其包装在外部查询中,以查找至少缺少一列的行(使用 OR 之间 WHERE 表达式)或根本没有数据的行(使用 AND 之间 WHERE 表达式)。

子查询看起来像这样:

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

这给了我所有的行(每天有一行) 1 (当天该字段的出现次数)或a -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,并且当您使用嵌套查询时,按时间过滤非常混乱。显然,如果大量涌入人群加入,那就更好了 is null 要么 not null 或类似于涌入的语法,但如上所述,他们似乎对这样做并不感兴趣。


0
2017-08-29 19:21