MySQL UDF 仅适用于 `IF` 中的 `WHERE` 子句

Posted

技术标签:

【中文标题】MySQL UDF 仅适用于 `IF` 中的 `WHERE` 子句【英文标题】:MySQL UDF only works in `WHERE` clause when wrapped in `IF` 【发布时间】:2019-01-23 20:21:19 【问题描述】:

我有一个类似的功能:

create function foo(<args>)
returns varchar(40)
begin
return sha1(concat_ws('-', <args>));
end

当我在这样的 where 子句中使用它时,我没有得到任何结果:

where fooCol = foo(<args>)

但这很有效:

where if(fooCol = foo(<args>), true, false)

我对此完全感到困惑。这一定是我不知道的函数的某些行为,但我一直无法弄清楚为什么会这样。

更新

这里有一个更详尽的例子。使用的所有列都是varchar(40)

delimiter $$

create function fn($fk varchar(40))
returns varchar(40)
begin
    return sha1(concat_ws('-',
        -- Real function takes more arguments but I was able
        -- to reproduce with a simplified version like this.
        coalesce($fk, 'None')
    ));
end

$$

select
    *
from
    foo
    left join bar on bar.id = foo.bar_id
where
    foo.fooKey = fn(bar.barKey)
    -- This will return rows!
    -- if(foo.fooKey = fn(bar.barKey), true, false);

更新 2

仅当barKey 为空时,上述操作才会失败。如果我只是传递 null 而不是使用该字段作为参数,它就可以工作。

【问题讨论】:

在 5.7 上使用 very simplistic example,这两个都按预期工作。我们可能需要更多信息来确定正在发生的事情、示例表 + 数据、定义函数的位置以及调用方式等。 是的,我会更新的。我只是用更简单的例子进行测试,那些确实有效,我试图找到发生这种情况的点...... 【参考方案1】:

我的问题似乎是由这个错误引起的:

https://bugs.mysql.com/bug.php?id=86922

是时候升级 MySQL 了!

【讨论】:

以上是关于MySQL UDF 仅适用于 `IF` 中的 `WHERE` 子句的主要内容,如果未能解决你的问题,请参考以下文章

每日一问-什么是Mysql数据库的UDF提权?

仅适用于 VS 设计视图的 Blend 中的 UnresolvedAssemblyException - 在 VS 设计视图中工作正常

是否可以在 MySQL UDF 中的 IF 条件内声明游标

我在 Excel VBA 中使用“InBetween”UDF,它适用于 43 行,然后停止工作

犰狳的自定义 natvis 文件仅适用于 resharper

m == q 中的错误:R 比较 (1) 仅适用于原子和列表类型