【问题标题】:SQL Boolean Vars in Where stamentWhere 语句中的 SQL 布尔变量
【发布时间】:2012-07-17 10:06:18
【问题描述】:

我正在制作一个 rdl 报告,并且我有三个复选框,如果选中,则需要更改我的 WHERE 语句。如果未选中,则结果应仅按日期范围匹配。如果选中一个或多个,则需要返回与变量对应的字符串匹配的字段。

WHERE 
(EffectiveDate BETWEEN @StartDate AND @EndDate) 
AND (((@IncludeSEWPrefix = 1 AND PrefixId = 'SEW') OR @IncludeSEWPrefix = 0)
AND ((@IncludePAWPrefix = 1 AND PrefixId = 'PAW') OR @IncludePAWPrefix = 0)
AND ((@IncludeRPLPrefix = 1 AND PrefixId = 'RPL') OR @IncludeRPLPrefix = 0)) 

到目前为止,我的代码在没有选中和选中一个时有效,但在选中多个复选框时不返回任何内容。所以为了尝试解决这个问题,我把代码改成了这个

WHERE 
(EffectiveDate BETWEEN @StartDate AND @EndDate) 
AND ((((@IncludeSEWPrefix = 1 AND PrefixId = 'SEW') OR @IncludeSEWPrefix = 0)
OR ((@IncludePAWPrefix = 1 AND PrefixId = 'PAW') OR @IncludePAWPrefix = 0)
OR ((@IncludeRPLPrefix = 1 AND PrefixId = 'RPL') OR @IncludeRPLPrefix = 0)))

无论选择什么,都会返回所有行。有人可以告诉我哪里出错了吗?

【问题讨论】:

    标签: sql where rdl


    【解决方案1】:

    我相信这是正确的重新排列。比最初出现的更棘手的问题。问题是将((@IncludeSEWPrefix = 1 AND PrefixId = 'SEW') OR @IncludeSEWPrefix = 0)AND 之类的行分开,这意味着如果两个包含为真,则一行需要同时包含PrefixId,这是不可能的。如果你用OR 将它们分开,那么只有一个包含 false,意味着每一行都会通过。因此,请检查一行是否包含任何包含的前缀,否则所有包含都必须关闭。

    WHERE EffectiveDate BETWEEN @StartDate AND @EndDate
    AND 
    (
        (@IncludeSEWPrefix = 1 AND PrefixId = 'SEW') OR
        (@IncludePAWPrefix = 1 AND PrefixId = 'PAW') OR 
        (@IncludeRPLPrefix = 1 AND PrefixId = 'RPL') OR
        (@IncludeSEWPrefix = 0 AND @IncludePAWPrefix = 0 AND @IncludeRPLPrefix = 0)
    )
    

    【讨论】:

    • 感谢您的解决方案完美运行,您的解释非常清楚
    【解决方案2】:

    试试这个

    WHERE  
    (EffectiveDate BETWEEN @StartDate AND @EndDate)  
    AND 
    (
    (@IncludeSEWPrefix = 1 AND PrefixId = 'SEW' OR @IncludeSEWPrefix = 0) AND 
    (@IncludePAWPrefix = 1 AND PrefixId = 'PAW' OR @IncludePAWPrefix = 0) AND 
    (@IncludeRPLPrefix = 1 AND PrefixId = 'RPL' OR @IncludeRPLPrefix = 0)
    )  
    

    【讨论】:

    • 感谢您的回复,但没有成功。我认为您的代码与我的第一个解决方案相同,但逗号更少。
    【解决方案3】:

    您的括号比需要的多,这不会造成伤害,但请注意。 也许这会有所帮助:

    WHERE (EffectiveDate BETWEEN @StartDate AND @EndDate) 
        AND (   ((@IncludeSEWPrefix = 1 AND PrefixId = 'SEW') OR (@IncludeSEWPrefix = 0 AND @PrefixId <> 'SEW'))
            OR ((@IncludePAWPrefix = 1 AND PrefixId = 'PAW') OR (@IncludePAWPrefix = 0 AND @PrefixId <> 'PAW'))
            OR ((@IncludeRPLPrefix = 1 AND PrefixId = 'RPL') OR (@IncludeRPLPrefix = 0 AND @PrefixId <> 'RPL'))
            )
    

    【讨论】:

    • 感谢您的回复,但此代码产生的结果与我的第一个示例相同。如果其中两个变量为真,则需要返回与任一字符串匹配的行
    • 不抱歉,这与我的第二个示例相同。无论检查了什么,它都会返回所有行。
    • 你能添加一个带有样本数据的脚本来测试吗?
    猜你喜欢
    • 2023-01-19
    • 1970-01-01
    • 1970-01-01
    • 2018-02-01
    • 2014-02-16
    • 2012-06-10
    • 2012-02-19
    • 2014-11-04
    • 2020-08-20
    相关资源
    最近更新 更多