当包装在`IF`中时,MySQL UDF仅在`WHERE`子句中起作用

时间:2019-01-23 20:21:19

标签: mysql where user-defined-functions

我有一个类似的功能:

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而不是使用字段作为参数,那么它将起作用。

1 个答案:

答案 0 :(得分:1)

我的问题似乎是由以下错误引起的:

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

该升级MySQL了!