繁体   English   中英

如何在 WHERE SQL 子句中添加条件或在过滤器为空时返回所有结果

[英]How do I add conditions in a WHERE SQL clause or return all results if filters are empty

我有一个带有 WHERE 子句的 SQL 语句,如果传递给存储过程 IN 参数的变量是某个值,我将在其中添加其他过滤器。

IN 参数称为 filterID 并且如果我需要所有记录可以为空,或者如果我只想 select 记录在左联接表中的这些列中具有 ID 的记录,则可以具有值 SEN、EAL 或 MAGT。

这是 SQL 查询的摘录,用于显示表的连接和附加过滤器。

LEFT JOIN tbl_sen ON tbl_pupil.pupilID = tbl_sen.pupilID 
        LEFT JOIN tbl_eal ON tbl_pupil.pupilID = tbl_eal.pupilID  
        LEFT JOIN tbl_magt ON tbl_pupil.pupilID = tbl_magt.pupilID
        WHERE 
        tbl_test.schoolID=schoolID
        AND (
            (filterID='SEN' AND tbl_sen.senID IS NOT NULL) OR 
            (filterID='EAL' AND tbl_eal.ealID IS NOT NULL) OR
            (filterID='MAGT' AND tbl_magt.magtID IS NOT NULL))
        AND tbl_test.import=1;

当我使用这些值执行存储过程时,它会显示正确的结果。 但是,如果我不想添加过滤器并将 filterID 作为空/NULL 传递,它会在我需要它返回所有结果时返回 0 个结果。

谁能发现我做错了什么?

...
AND CASE filterID WHEN 'SEN' THEN tbl_sen.senID IS NOT NULL
                  WHEN 'EAL' THEN tbl_eal.ealID IS NOT NULL
                  WHEN 'MAGT' THEN tbl_magt.magtID IS NOT NULL
                  ELSE filterID IS NULL END
AND ...

据我了解, filterID是局部变量(SP 参数),因此使用它两次没有问题(而不是查询的绑定参数 - 在这种情况下,您可以使用用户定义的中间变量)。

简化演示

AND (
    (filterID='SEN' AND tbl_sen.senID IS NOT NULL) OR 
    (filterID='EAL' AND tbl_eal.ealID IS NOT NULL) OR
    (filterID='MAGT' AND tbl_magt.magtID IS NOT NULL) OR
    (filterID IS NULL)
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM