【问题标题】:How to use WHERE IN with an empty value in MySQL 5.7?如何在 MySQL 5.7 中将 WHERE IN 与空值一起使用?
【发布时间】:2021-04-02 10:55:06
【问题描述】:

我正在尝试在 grafana 7.4.x 中创建一个动态仪表板,其中包含可以选择的变量。这适用于一个例外。如果没有选择值,则该值为空,将导致 MySQL (5.7.32) 错误。

$value = 1,2,3
SELECT *
FROM TEST
WHERE ID IN ( ${test:csv} )

空值导致:

$value = ''
SELECT *
FROM TEST
WHERE ID IN (  )

如何重写这个查询,以免导致错误,而只是忽略这个 where 语句(因为有很多 AND)

【问题讨论】:

  • 是的,但 0 将导致 0 个结果。这是作为众多过滤器之一的可选过滤器。
  • 如果您要从多个过滤器动态构建WHERE 子句,请在添加ID IN (...) 之前检查列表是否为空。
  • 怎么样? IF (${test:csv} , 0,1) 也会导致: IF ( , 0, 1)
  • 不是在 SQL 中,而是在您用于创建查询的编程语言中。
  • 这正是问题所在。这是不可能的,它是 Grafana 作为前端,您只能将 MySQL 添加为 Query。

标签: mysql grafana


【解决方案1】:

你可以试试:

where id in (coalesce($value, 0))

但我不确定这是否适用于 grafana 查询生成器 - 但值得一试

【讨论】:

  • 好方法,但是这在没有 Grafana 的 MySQL 原生中都不起作用: IN (coalesce (, 0) )
  • 你没有任何价值,即不为空
【解决方案2】:

您可以使用FIND_IN_SET 代替IN,因为该函数将采用空字符串:

SELECT *
FROM TEST
WHERE FIND_IN_SET(ID, '$value')

【讨论】:

  • 是的!谢谢,那行得通。我很惊讶有多少关于 SQL 的知识
  • @merlin 确实 - 标准还不错,但是有 所以 很多 DBMS 特定功能,例如这个。
  • 不是FIND_IN_SETSET 指定mysql 类型吗?
  • @Seti 理论上是的,但是它的工作方式意味着它可以用来在逗号分隔的列表中查找值
  • 是的,但是在数字字段上会非常非常慢,因为它会检查每一行的数字 ID 和字符串到数字的转换 - 是吗?
猜你喜欢
  • 1970-01-01
  • 2021-03-25
  • 2011-10-20
  • 2016-08-11
  • 2016-06-10
  • 2020-05-06
  • 1970-01-01
  • 2020-01-07
  • 1970-01-01
相关资源
最近更新 更多