我运行查询并以表的形式获取 custId 列表。我如何将此结果传递到 IN 子句内的另一个搜索查询中。
例如:
搜索1:index=*“登录成功”|表custID 这给了我带有 custID 列的表格。
那我得跑了
index=* "邮件发送者"|where custID IN (搜索 1) |table CustID,_time
使用子搜索。您必须尝试使用
format
选项才能使输出与 IN
兼容。
index=* "mail sent by"|where custID IN ([search index=* "successful login for"|fields custID | format]) |table CustID,_time
如果无法正确获得
format
输出,您可能必须使用没有 IN
的旧方法。
index=* "mail sent by"|where [search index=* "successful login for"|fields custID | format] |table CustID,_time
顺便说一句,
index=*
对于生产来说不是一个好的做法。使用真实的索引名称以获得更好的性能。
index=myindex <mainSearchConditions>
custID IN (
[search index=myindex <subsearchConditions> | table custID | dedup custID
| stats values(eval("\"".custID."\"")) as search delim="," | nomv search]
)
本质上,Splunk 搜索可以返回多个项目。通常,这采用事件列表或表格的形式。 Subsearch 没有什么不同——当然,它可能会返回多个结果。
format
):
此命令由子搜索隐式使用。此命令获取子搜索的结果,将结果格式化为单个结果,并将该结果放入名为搜索的新字段中。
文档中的上述引用是一种神秘的说法,子搜索结果被转换为查询表达式以匹配任何子搜索输出。
因此,子搜索的结果实际上与应用 IN 运算符 相同 - 每个子搜索结果将是一个匹配值。所以你不需要使用
IN
来达到预期的结果。
index=* "mail sent by"|where custID IN (search 1) |table CustID,_time
可写为:
index=* "mail sent by" [search {search 1}] |table CustID,_time
由于
(search 1)
生成包含列 custID
的表,因此子搜索不需要额外的处理即可达到指定的结果。子搜索将替换为以下内容:
( (custID="result1") OR (custID="result") OR ...)
[search index=main |stats max(batch) as batch]
子搜索返回一个包含单列和单个项目的表。为了使外部查询按预期工作,将列(使用
as
)从“max(batch)”重命名为“batch”非常重要,以便它与原始数据中的“batch”字段匹配.
生成的查询表达式将如下所示:
( batch="{max(batch)}" )