从值为 null 的 InfluxDB 中选择

Posted

技术标签:

【中文标题】从值为 null 的 InfluxDB 中选择【英文标题】:select from InfluxDB where value is null 【发布时间】:2015-07-17 11:45:06 【问题描述】:

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

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

那么在旧版 SQL 语言中,语句将是:

select * from table where b is null

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

我正在处理列中可选有数值的数据,并且我想选择该列为空/空的记录。由于这些是整数,它们似乎根本无法与匹配的正则表达式一起使用,所以像 where !~ /.*/ 这样的东西就出来了。

【问题讨论】:

还是not possible to search for NULLs in InfluxDB。 【参考方案1】:

You cannot search for nulls influxDB will not be able to insert nulls influx >=0.9

【讨论】:

虽然您不能再在 InfluxDB 中插入空值,queries still return nulls,但您不能查询 by null(例如 IS NULL 或 IS NOT NULL)。 SO - 这已经是六年前的事了……现在还是这样吗?如果是这样,为什么这仍然是一件事?【参考方案2】:

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

SELECT * FROM service_detail where username != ''

【讨论】:

这适用于搜索 non-NULL 值。要搜索 NULL,不能说 username = '',因为那是空字符串,与该字段根本没有值不同。 @DanDascalescu 你所说的对于 fields 是正确的。但是,对于 tags,执行WHERE some_tag = '' 匹配标签没有值的行。 (标签值仍将在来自/query API 的 JSON 响应中返回为 null,但不是空字符串,因为内部一致的类型系统适用于三色紫罗兰。) 伙计们,我的回答是@glasnt 所说内容的延伸,请理解上下文,然后判断有助于解决问题的答案。 这对我不起作用。我有一个名为“type”的字段键,我需要选择“type”中没有任何内容的所有行。 Select * from ... where type='' 不返回任何内容。【参考方案3】:

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

我有一个包含 5 个字段的指标:macwinwin64linuxlinux64,并非每行都填写了每个字段,有时一行不会由于当时没有可用数据而添加。

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

子查询如下所示:

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 nullnot null 或一些类似的语法到 influxql 会更好,但正如上面链接的那样,他们似乎对此不太感兴趣。

【讨论】:

【参考方案4】:

在 OSS 2.0 的 Flux 查询中,我遇到了同样的问题 -> 无法搜索“null”标签 步骤:

如果您搜索“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 =~ /^$/)

=> 有效!

【讨论】:

以上是关于从值为 null 的 InfluxDB 中选择的主要内容,如果未能解决你的问题,请参考以下文章

从值列表中选择

检测是不是从值中选择了特定选项[重复]

sql 从值列表中选择

hive中用not in查询正确数据,返回值为空

Using InfluxDB in Grafana,influxDB在grafana中使用

webservice 传值为null