优化 MySQL 查询以避免不必要的用户定义函数调用

发布于 2024-08-25 16:32:44 字数 477 浏览 4 评论 0原文

我有一个查询,它在 SELECT 语句中对用户定义的函数进行多次调用。函数 (vfget) 从字符串中包含的 key=value 对返回值。

查询是否可以只调用该函数一次并将其存储在变量中,以便可以在同一查询中重用?

目前我的查询是:

SELECT 
        CASE WHEN(right(vfget(appmod_params, 'service'), 3) = '_dd' OR right(vfget(appmod_params, 'service'), 3) = '_wp')
            THEN left(vfget(appmod_params, 'service'), length(vfget(appmod_params, 'service'))-3)
            ELSE vfget(appmod_params, 'service')
        END
FROM ota1003
LIMIT 10

I have a query that makes several calls within a SELECT statement to a user-defined function. The function (vfget) returns the value back from key=value pairs contained within a string.

Is it possible for the query to just call the function once and store this in a variable so that it can be reused within the same query?

Currently my query is:

SELECT 
        CASE WHEN(right(vfget(appmod_params, 'service'), 3) = '_dd' OR right(vfget(appmod_params, 'service'), 3) = '_wp')
            THEN left(vfget(appmod_params, 'service'), length(vfget(appmod_params, 'service'))-3)
            ELSE vfget(appmod_params, 'service')
        END
FROM ota1003
LIMIT 10

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

秉烛思 2024-09-01 16:32:44
SELECT  @vf := vfget(appmod_params, 'service'),
        case when right(@vf, 3) IN ('_dd', '_wp')
            then left(@vf, length(@vf) - 3)
            else @vf
        end
from ota1003
limit 10

或者这样:

SELECT  case when right(vf, 3) IN ('_dd', '_wp')
            then left(vf, length(vf) - 3)
            else vf
        end
FROM    (
        SELECT  vfget(appmod_params, 'service') AS vf
        FROM    ota1003
        LIMIT 10
        ) q

MySQL 中的嵌套查询会被缓冲,因此效率较低,尽管只有 10 条记录,这应该不是什么大问题。

SELECT  @vf := vfget(appmod_params, 'service'),
        case when right(@vf, 3) IN ('_dd', '_wp')
            then left(@vf, length(@vf) - 3)
            else @vf
        end
from ota1003
limit 10

or this:

SELECT  case when right(vf, 3) IN ('_dd', '_wp')
            then left(vf, length(vf) - 3)
            else vf
        end
FROM    (
        SELECT  vfget(appmod_params, 'service') AS vf
        FROM    ota1003
        LIMIT 10
        ) q

Nested queries in MySQL are buffered and hence less efficient, though with only 10 records this should not be much of a problem.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文