【问题标题】:How do I add conditions in a WHERE SQL clause or return all results if filters are empty如果过滤器为空,如何在 WHERE SQL 子句中添加条件或返回所有结果
【发布时间】:2021-08-09 03:52:15
【问题描述】:

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

IN 参数称为 filterID,如果我需要所有记录,则可以为空,如果我只想从 LEFT JOINED 表中选择在这些列中具有 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 个结果。

谁能发现我做错了什么?

【问题讨论】:

  • 谢谢 Stu,如果这是我需要做的,我在动态 SQL 方面有很多学习要做。

标签: mysql sql stored-procedures


【解决方案1】:
...
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 参数),因此使用它两次没有问题(而不是查询的绑定参数 - 在这种情况下,您可以使用用户定义的中间变量)。

Simplified DEMO

【讨论】:

  • 这完全有道理......虽然我添加了它并且查询仍然没有返回任何结果。而如果我完全删除 filterID 选项,它会返回很多记录....会坚持下去。
  • @petworthnick Fiddle 添加了。
  • 很清楚,谢谢。当我在 phpmyadmin 中执行 SP 时,它什么也没有返回。但是...如果我运行 SQL CALL sp_test(3,14,26,NULL) (其中 NULL 值是 filterID),它将返回记录。这看起来很有希望,因为这就是我从 PHP 中调用它的方式。感谢您的帮助。
  • 根据您在这里帮助我的内容....我已将其应用于我正在使用的另一个过滤器。我使用以下行: CASE progressVal WHEN ('wellbelow' OR 'muchlower') THEN tbl_progress.progress='远低于预期' ELSE progressVal IS NULL END 但是,我收到一条警告:警告:#1292 截断不正确的 DOUBLE 值: 'wellbelow' 警告:#1292 截断不正确的 DOUBLE 值:'muchlower' 我必须将它们分开,还是有更好的解决方法?谢谢。
【解决方案2】:
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)
)

【讨论】:

  • 这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方留下评论。 - From Review
猜你喜欢
  • 2015-08-02
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-31
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
相关资源
最近更新 更多