为简单的布尔 WHERE 子句而苦苦挣扎

Struggling with simple boolean WHERE clause

提问人:DeveloperDan 提问时间:9/19/2019 最后编辑:DeveloperDan 更新时间:9/19/2019 访问量:495

问:

疲惫的大脑 - 也许你可以帮忙。
我的表有两个位字段:
1) 和
2) 。
两者都可能 = 1。
用户界面有两个相应的复选框。在代码中,我将检查转换为 int。
TestedByPCLTestedBySPC

int TestedBySPC = SearchSPC ? 1 : 0;
int TestedByPCL = SearchPCL ? 1 : 0;

我的子句如下所示:WHERE

WHERE TestedByPCL = {TestedByPCL.ToString()} AND TestedBySPC = {TestedBySPC.ToString()} 

问题是,当只选中一个复选框时,我想返回相应字段设置为 1 或两个字段都设置为 1 的行。
现在,当两个字段都设置为 1 时,my 子句需要选中两个复选框,而不是只选中一个。
因此,如果勾选一个复选框,则返回该字段 = 1 的记录,而不管另一个字段是否 = 1。
WHERE

t-sql 布尔逻辑

评论

0赞 jarlh 9/19/2019
向我们展示一些示例表数据和预期结果。(作为格式化文本,没有图像。
0赞 forpas 9/19/2019
这个:当只选择一个复选框时,我想返回两个字段都设置为 true 的行,并且:如果勾选一个复选框,则返回该字段为 true 的记录,无论另一个字段是否为 true,都是 2 个不同的要求。你能澄清一下吗?
0赞 DeveloperDan 9/19/2019
我澄清了这个问题(我希望),但看起来我在下面得到了 Zohar 的答案。谢谢。

答:

1赞 Zohar Peled 9/19/2019 #1

第二次尝试(我想我现在已经成功了):

WHERE ((TestedByPCL = {chkTestedByPCL.IsChecked} AND TestedBySPC = {chkTestedBySPC.IsChecked}) 
OR 
(TestedByPCL = 1 AND TestedBySPC = 1 AND 1 IN ({chkTestedByPCL.IsChecked}, {chkTestedBySPC.IsChecked})))

误解了这个问题。AND 更改为 OR

WHERE TestedByPCL = {chkTestedByPCL.IsChecked} OR TestedBySPC = {chkTestedBySPC.IsChecked}

也:

  1. SQL Server 没有布尔数据类型,它最接近的选项是数据类型。bit

  2. 大括号的使用建议使用字符串连接来构建子句。当您处理复选框时,这可能没什么大不了的,但在处理自由文本输入时会带来安全风险,因为它为 SQL 注入攻击敞开了大门。最好尽可能使用参数。where

评论

0赞 DeveloperDan 9/19/2019
是的,数据类型是位。我已经修改了问题以匹配我的代码。有了这个答案,但是当我取消选中这两个框时,将返回结果。我得到的结果任一字段都为零。
0赞 DeveloperDan 9/19/2019
非常好!你的修订似乎很完美。对不起,我最初不清楚。
0赞 Zohar Peled 9/19/2019
很乐意帮忙:-)
1赞 HABO 9/19/2019
<迂腐>有一种布尔数据类型(值为 TRUE、FALSE 和 UNKNOWN),但您无法牢牢掌握其中一种:“与其他 SQL Server 数据类型不同,布尔数据类型不能指定为表列或变量的数据类型,也不能在结果集中返回。用。。。如果没有布尔值,这将是具有挑战性的.</pedantry>wherecaseiif
0赞 Zohar Peled 9/19/2019
@HABO 嗯,我们是开发人员。如果我们不吹毛求疵,谁会吹毛求疵?你当然是对的。