包括与 IN() 子句不匹配的行

Posted

技术标签:

【中文标题】包括与 IN() 子句不匹配的行【英文标题】:Include rows which don't match with IN() clause 【发布时间】:2020-06-15 18:56:04 【问题描述】:

我有一个名为log 的表,其中包含多个应用程序发送的日志。此表有一个名为 referencevarchar 字段。

我在 Grafana 中有一个表格面板,其中显示了我们按 reference 值分组的日志数量。因此,用户在 Grafana 上的文本字段中键入一个或多个值,例如 'ref1', 'ref2', 'ref3',然后会触发这样的查询:

SELECT reference, count(id)
FROM db.log
WHERE reference IN('ref1', 'ref2', 'ref3')
GROUP BY reference

到目前为止一切顺利,它按预期工作。我想做的是用count=0 显示一行,以防给定reference 的日志不存在。我知道我可以使用UNION 添加任意行,但我认为我无法在 Grafana 中动态添加。

有什么想法吗?

【问题讨论】:

【参考方案1】:

使用一个查询来返回您想要的结果的所有值并左连接表以进行聚合:

select t.reference, count(l.id) 
from (
  select 'ref1' reference union all
  select 'ref2' union all
  select 'ref3' 
) t left join db.log l
on l.reference = t.reference
group by t.reference

查看简化的demo。

【讨论】:

以上是关于包括与 IN() 子句不匹配的行的主要内容,如果未能解决你的问题,请参考以下文章

SQL IN 子句仅返回以逗号分隔的 ID 列表中具有第一个匹配项的行

Oracle In(匹配)子句

Oracle In(匹配)子句

where 子句限制完全匹配的行,显示部分匹配的行

SSIS 查找行为很奇怪

匹配 IN 子句中的所有值