如何在 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_SET
为SET
指定mysql 类型吗?
@Seti 理论上是的,但是它的工作方式意味着它可以用来在逗号分隔的列表中查找值
是的,但是在数字字段上会非常非常慢,因为它会检查每一行的数字 ID 和字符串到数字的转换 - 是吗?以上是关于如何在 MySQL 5.7 中将 WHERE IN 与空值一起使用?的主要内容,如果未能解决你的问题,请参考以下文章
EXISTS 与 IN - MySQL 5.5 和 MySQL 5.7 中哪一个更好?