无法使用CASE / WHEN编写MySQL过程

时间:2013-04-03 08:22:01

标签: mysql procedure

我尝试编写一个过程,该过程将返回所有行的子集,或者根据输入返回所有行。 我现在正在玩一些代码(粘贴在下面)。在此代码中,我手动设置var1var2(最终将传递参数)并查询其值。

现在代码返回满足约束userDataTypeName="currentGPA"userDataText="4,"的行,但如果这些值中的任何一个为NULL,则代码不返回任何行。如果userDataText=NULL的值而不是none,我希望返回表中的所有行。我想也许COALESCE可以帮助我实现这个目标,但我不确定。

关于如何实现这一目标的任何想法?

BEGIN
    DECLARE var1 varchar(20);
        DECLARE var2 varchar(20);
        SET var1 = "currentGPA";
        SET var2 = "4";
    SELECT udata.user_id FROM userdata udata
        WHERE(
    COALESCE(udata.userDataTypeName, '')  =
    CASE
            WHEN var1 IS NULL THEN ''
            ELSE var1
    END
        and
        COALESCE(udata.userDataText, '') = COALESCE(var2, '')) LIMIT 30;
END

2 个答案:

答案 0 :(得分:1)

CASE似乎等于COALESCE(var1,'')。

现在查询,您正在将COALESCE应用于表中的每一行。这是非常低效的,将每行中的值与期望值进行比较会更好。在这种情况下,所需的值为NULL或var1 / var2。这给出了以下查询,它可以更有效地执行(基于OP +后面的注释查询)

SELECT udata.user_id 
FROM userdata udata
WHERE udata.userDataTypeName = COALESCE(var1,'')
AND (
    var2 IS NULL
    OR
    udata.userDataText = var2
)
LIMIT 30;

答案 1 :(得分:0)

CASE 什么?

CASE var1
   WHEN IS NULL THEN ''
   ELSE var1
END
相关问题