0

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

现在,代码返回满足约束的行,userDataTypeName="currentGPA"但是userDataText="4,"如果这些值中的任何一个为 NULL,则代码不返回任何行。userDataText=NULL如果值为 for而不是 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
4

2 回答 2

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;
于 2013-04-03T08:31:19.007 回答
0

案例什么?

CASE var1
   WHEN IS NULL THEN ''
   ELSE var1
END
于 2013-04-03T08:26:08.890 回答