Grafana 过滤器介绍(literal_or、iliteral_or、not_literal_or、not_literal_or)

Grafana 中的变量(Variables)在创建和使用时,可以通过 高级选项(Advanced options) 来设置变量的 多值数据过滤器(Multi-value variable filtering options),这些选项决定了当变量包含多个值时,在查询中如何插入和处理这些值。其中,常见的过滤器选项包括:

  1. literal_or
  2. iliteral_or
  3. not_literal_or
  4. not_iliteral_or

以下是这些选项的详细区别和使用方式:


1. literal_or

  • 含义 :进行 区分大小写 的 精确匹配 ,使用 OR 运算符连接。

  • 用途 :当变量包含多个值时,使用 OR 将多个值连接起来,查询包含任意一个指定值的数据。

  • 示例:

    假设变量 $var 具有值:value1, value2。

    查询语句:

    sql 复制代码
    SELECT * FROM table WHERE field IN ($var)

    使用 literal_or 过滤器,变量会被替换为:

    sql 复制代码
    SELECT * FROM table WHERE field IN ('value1', 'value2')

    或等价于:

    sql 复制代码
    SELECT * FROM table WHERE field = 'value1' OR field = 'value2'

2. iliteral_or

  • 含义 :进行 不区分大小写 的 精确匹配 ,使用 OR 运算符连接。

  • 用途 :当变量包含多个值时,使用 OR 将多个值连接起来,查询包含任意一个指定值的数据,匹配时不区分大小写。

  • 示例:

    假设变量 $var 具有值:Value1, Value2。

    查询语句:

    sql 复制代码
    SELECT * FROM table WHERE LOWER(field) IN (LOWER($var))

    使用 iliteral_or 过滤器,变量会被替换为:

    sql 复制代码
    SELECT * FROM table WHERE LOWER(field) IN (LOWER('Value1'), LOWER('Value2'))

    或者在支持不区分大小写匹配的数据库中,可以使用:

    sql 复制代码
    SELECT * FROM table WHERE field ILIKE 'Value1' OR field ILIKE 'Value2'

3. not_literal_or

  • 含义 :进行 区分大小写 的 精确不匹配 ,使用 AND 运算符连接。

  • 用途 :当变量包含多个值时,使用 AND 将多个 不等于 条件连接起来,排除指定的值。

  • 示例:

    假设变量 $var 具有值:value1, value2。

    查询语句:

    sql 复制代码
    SELECT * FROM table WHERE field NOT IN ($var)

    使用 not_literal_or 过滤器,变量会被替换为:

    sql 复制代码
    SELECT * FROM table WHERE field NOT IN ('value1', 'value2')

    或等价于:

    sql 复制代码
    SELECT * FROM table WHERE field != 'value1' AND field != 'value2'

4. not_iliteral_or

  • 含义 :进行 不区分大小写 的 精确不匹配 ,使用 AND 运算符连接。

  • 用途 :当变量包含多个值时,使用 AND 将多个 不等于 条件连接起来,排除指定的值,匹配时不区分大小写。

  • 示例:

    假设变量 $var 具有值:Value1, Value2。

    查询语句:

    sql 复制代码
    SELECT * FROM table WHERE LOWER(field) NOT IN (LOWER($var))

    使用 not_iliteral_or 过滤器,变量会被替换为:

    sql 复制代码
    SELECT * FROM table WHERE LOWER(field) NOT IN (LOWER('Value1'), LOWER('Value2'))

    或者在支持不区分大小写匹配的数据库中,可以使用:

    sql 复制代码
    SELECT * FROM table WHERE field NOT ILIKE 'Value1' AND field NOT ILIKE 'Value2'

总结

  • literal_or :区分大小写的 OR 精确匹配。用于查询字段等于指定值的数据。
  • iliteral_or :不区分大小写的 OR 精确匹配。用于查询字段等于指定值(忽略大小写)的数据。
  • not_literal_or :区分大小写的 AND 精确不匹配。用于排除字段等于指定值的数据。
  • not_iliteral_or :不区分大小写的 AND 精确不匹配。用于排除字段等于指定值(忽略大小写)的数据。

应用场景

  • literal_or:当您希望查询结果包含某字段等于多个特定值时,且需要区分大小写。
  • iliteral_or:当您希望查询结果包含某字段等于多个特定值时,且不区分大小写。
  • not_literal_or:当您希望查询结果排除某字段等于多个特定值时,且需要区分大小写。
  • not_iliteral_or:当您希望查询结果排除某字段等于多个特定值时,且不区分大小写。

注意事项

  • 支持性 :并非所有数据源都支持不区分大小写的匹配(如 ILIKE 运算符)。在使用 iliteral_or 和 not_iliteral_or 时,请确保您的数据源支持相应的功能。
  • 性能影响:使用不区分大小写的匹配或否定匹配可能会对查询性能产生影响,具体影响程度取决于数据源和数据量。
  • 变量值格式:确保变量值与查询字段的数据类型和格式匹配,例如字符串需要加引号,数值类型不需要。

示例应用

场景1 :查询用户表中用户名为 Alice 或 Bob 的记录,区分大小写。

  • 过滤器 :literal_or

  • 查询:

    sql 复制代码
    SELECT * FROM users WHERE username = 'Alice' OR username = 'Bob';

场景2 :查询日志表中级别为 error 或 warning 的记录,不区分大小写。

  • 过滤器 :iliteral_or

  • 查询:

    sql 复制代码
    SELECT * FROM logs WHERE level ILIKE 'error' OR level ILIKE 'warning';

场景3 :查询商品表中排除类别为 Electronics 和 Furniture 的商品,区分大小写。

  • 过滤器 :not_literal_or

  • 查询:

    sql 复制代码
    SELECT * FROM products WHERE category != 'Electronics' AND category != 'Furniture';

场景4 :查询订单表中排除状态为 completed 和 shipped 的订单,不区分大小写。

  • 过滤器 :not_iliteral_or

  • 查询:

    sql 复制代码
    SELECT * FROM orders WHERE status NOT ILIKE 'completed' AND status NOT ILIKE 'shipped';

通过上述解释,您可以根据具体需求选择合适的过滤器选项,以准确控制变量在查询中的替换方式和匹配逻辑。选择正确的过滤器有助于构建高效、准确的查询。

相关推荐
IT研究室3 小时前
最新计算机毕业设计选题推荐-基于spring boot的葡萄酒文化宣传网站-网站-文档指导-Java-springboot
java·spring boot·课程设计
慧都小项3 小时前
MyEclipse 中创建和测试 JAX-RS REST 接口:从项目配置到 REST Explorer
java·restful·myeclipse·jax-rs
Wang's Blog3 小时前
Java 项目实战: 交友项目 - 入门案例:编写 Dubbo 服务提供者
java·dubbo·交友
u0111026753 小时前
JPG、PNG、WebP 怎么选?按透明度、体积和使用场景做判断
前端·javascript·vue.js·图像处理·ai作画
秋饼3 小时前
Spring AI 2.0 结构化输出企业级实战:从 BeanOutputConverter 源码到生产级解析容错
java·ai·技术分享·后端开发
摇滚侠3 小时前
《计算机是如何工作的:人人都能懂的计算机软硬件工作原理》第 9 章 机器码与汇编语言 阅读笔记 9
java·开发语言·笔记
Cc.Y4 小时前
Java零基础入门:深入Java核心:文件IO与序列化全解
java·开发语言·python
拿本唠嗑AI研究4 小时前
本体工程实战指南:从建模到可维护的完整落地路径
java·人工智能·python·jena·ontology
jerrywus4 小时前
让 AI 写完代码后交一份报告:我改造了 answer-me-with-html
前端·claude·cursor
lambo mercy4 小时前
Day3:结构化输出
java·数据库·oracle