提问人:DeveloperDan 提问时间:9/19/2019 最后编辑:DeveloperDan 更新时间:9/19/2019 访问量:495
为简单的布尔 WHERE 子句而苦苦挣扎
Struggling with simple boolean WHERE clause
问:
疲惫的大脑 - 也许你可以帮忙。
我的表有两个位字段:
1) 和
2) 。
两者都可能 = 1。
用户界面有两个相应的复选框。在代码中,我将检查转换为 int。TestedByPCL
TestedBySPC
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
答:
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}
也:
SQL Server 没有
布尔数据
类型,它最接近的选项是数据类型。bit
大括号的使用建议使用字符串连接来构建子句。当您处理复选框时,这可能没什么大不了的,但在处理自由文本输入时会带来安全风险,因为它为 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>where
case
iif
0赞
Zohar Peled
9/19/2019
@HABO 嗯,我们是开发人员。如果我们不吹毛求疵,谁会吹毛求疵?你当然是对的。
评论