【问题标题】:SQL optional condition in WHERE clause in Report Builder报表生成器中 WHERE 子句中的 SQL 可选条件
【发布时间】:2018-01-10 05:21:09
【问题描述】:

我正在使用 Microsoft Report Builder 3.0 创建报告。我想在 WHERE 子句中添加一个附加条件取决于布尔参数 @param。在编程中,通过附加如下 SQL 字符串会很容易:

String sql = "SELECT * FROM tblA WHERE tblA.columnA = 'data' ";
if(param)
{
    sql += "AND tblA.columnB IN (SELECT column FROM tbl)";
}

但是如何在纯 SQL 查询中做到这一点?我尝试使用 CASE 但似乎它不起作用。这是我尝试过的:

SELECT * FROM tblA 
WHERE tblA.columnA = 'data'
CASE @param WHEN 1 THEN AND tblA.columnB IN (SELECT column FROM tbl) END

【问题讨论】:

  • 使用. 而不是+
  • CASE 无法正常工作,您可以发布您尝试过的内容吗?
  • 而不是直接将@param 写入sql 为什么不进行查询

标签: mysql reportbuilder3.0


【解决方案1】:

只要使用涉及参数的逻辑即可:

SELECT *
FROM tblA
WHERE
    columnA = 'data' AND
    (!param OR columnB IN (SELECT column FROM tbl));

如果columnA 包含data,则WHERE 子句的计算结果为true,并且参数设置为false,或者参数设置为true 并且子查询成功。

【讨论】:

  • OP 表示仅当param 为真时才需要添加条件,我猜在您的逻辑中它将始终适用,因为OR 查询中可能有数据,这将是真的跨度>
  • @PrateikDarji 如果param 为假,那么WHERE 子句的整个后半部分将始终评估为真,即它的行为就像没有后半部分一样。如果param 为真,那么我们必须检查子查询。 AFAIK 这是 OP 中的逻辑。
【解决方案2】:
SELECT * FROM [tblA] WHERE tblA.columnA = 'data' AND 
    (@param <> 1 OR columnB IN (SELECT column FROM tbl)).

简而言之,可以将可选条件与您要验证的标志放在 OR 条件中。假设您在名为@name 和@dept 的过程中传递了参数,并且您想要检索所有提及名称的结果或特定部门中提及名称的结果,那么您可以将其写为

SELECT * FROM [Employees] WHERE Name = @name AND (Department = @dept OR @dept = 0)

【讨论】:

    【解决方案3】:

    param是在客户端设置的,所以你需要在客户端进行查询,你可以使用CASE查询来实现,如下所示

    String sql = "SELECT * FROM tblA 
               WHERE tblA.columnA = 'data' 
               AND CASE " +param+ "
                   WHEN 1 THEN tblA.columnB IN (SELECT column FROM tbl) 
                  ELSE 1 
               END";
    

    我希望它会起作用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-15
      • 1970-01-01
      • 2022-08-14
      • 2020-08-02
      • 2013-09-08
      • 2014-11-01
      相关资源
      最近更新 更多