如何在 MySQL 5.7 中将 WHERE IN 与空值一起使用?

Posted

技术标签:

【中文标题】如何在 MySQL 5.7 中将 WHERE IN 与空值一起使用?【英文标题】:How to use WHERE IN with an empty value in MySQL 5.7? 【发布时间】: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。 【参考方案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 和字符串到数字的转换 - 是吗?

以上是关于如何在 MySQL 5.7 中将 WHERE IN 与空值一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

将数组转换为 WHERE IN mysql 子句的格式

mysql where in(几千个ID)如何优化

mySQL:如何在 WHERE IN 子句中删除 [重复]

EXISTS 与 IN - MySQL 5.5 和 MySQL 5.7 中哪一个更好?

如何在使用 MySQL 2 的 Rails 3 项目中使用 WHERE IN?

如何在 Laravel 中将两个分组的 whereIn 子句与 Where not 组合