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` 子句的主要内容,如果未能解决你的问题,请参考以下文章
仅适用于 VS 设计视图的 Blend 中的 UnresolvedAssemblyException - 在 VS 设计视图中工作正常
我在 Excel VBA 中使用“InBetween”UDF,它适用于 43 行,然后停止工作