我尝试编写一个过程,该过程将返回所有行的子集,或者根据输入返回所有行。
我现在正在玩一些代码(粘贴在下面)。在此代码中,我手动设置var1
和var2
(最终将传递参数)并查询其值。
现在代码返回满足约束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
答案 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