如何仅使用在不使用动态SQL的情况下检查的复选框,将WHERE子句设置为在多个位列上进行过滤?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何仅使用在不使用动态SQL的情况下检查的复选框,将WHERE子句设置为在多个位列上进行过滤?相关的知识,希望对你有一定的参考价值。
我试图使用带有SqlDataSource控件的复选框和参数来过滤select语句的结果。
问题是参数不能是未定义的,我只希望任何给定的参数等于“1”或“True”(如果它们被定义)。在任何其他时候,它们根本不应该在WHERE子句中使用(或者可能设置为“IS NOT NULL”)。
基本上,当选中复选框时,WHERE子句应包含与该复选框关联的参数,参数值应为“1”(True),否则,如果复选框处于任何其他状态,则“未选中”或“不确定“WHERE子句根本不应该包含该复选框的参数,或者应该设置为某个基本上选择”1“(True)或”0“(False)的值。
我尝试通过添加括号,添加“AND”和“OR”语句来玩WHERE子句,但我似乎无法弄明白。动态SQL很容易解决这个问题,但这将是一个噩梦,维护,这只是不好的做法。
例如,假设您有以下数据集:
| ID | Col1 | BitField1 | BitField2 | BitField3 |
| 1 | Row1 | 1 | 0 | 1 |
| 2 | Row2 | 1 | 1 | 1 |
| 3 | Row3 | 1 | 0 | 1 |
| 4 | Row4 | 1 | 1 | 0 |
| 5 | Row5 | 0 | 0 | 0 |
在我们的UX上,我们将有3个复选框,一个用于数据中的每个“BitField”。
如果用户没有选中任何复选框,则搜索结果应返回:
| ID | Col1 | BitField1 | BitField2 | BitField3 |
| 1 | Row1 | 1 | 0 | 1 |
| 2 | Row2 | 1 | 1 | 1 |
| 3 | Row3 | 1 | 0 | 1 |
| 4 | Row4 | 1 | 1 | 0 |
| 5 | Row5 | 0 | 0 | 0 |
并且WHERE语句应该基本上没有参数,或者如果它没有参数,它将类似于WHERE BitField1 IS NOT NULL AND BitField2 IS NOT NULL AND BitField3 IS NOT NULL
。
如果用户选中与“BitField2”关联的框,则结果应为:
| ID | Col1 | BitField1 | BitField2 | BitField3 |
| 2 | Row2 | 1 | 1 | 1 |
| 4 | Row4 | 1 | 1 | 0 |
而WHERE语句应该是WHERE BitField2 = 1
。
如果用户选中与“BitField1”和“BitField2”关联的框,则结果应为:
| ID | Col1 | BitField1 | BitField2 | BitField3 |
| 2 | Row2 | 1 | 1 | 1 |
| 4 | Row4 | 1 | 1 | 0 |
而WHERE语句应该是WHERE BitField1 = 1 AND BitField2 = 1
。
如果用户检查所有框,结果应为:
| ID | Col1 | BitField1 | BitField2 | BitField3 |
| 2 | Row2 | 1 | 1 | 1 |
而WHERE语句应该是WHERE BitField1 = 1 AND BitField2 = 1 AND BitField3 = 1
。
这是我可以不使用动态SQL做的事情吗?我没有使用存储过程,而是使用标准TSQL查询。
任何帮助将不胜感激。
如果未选中框,请将其设置为参数值DBNull.Value
。然后在WHERE
条款中为每个执行此操作
... AND BitFieldX = ISNULL(@BitFieldX, [BitFieldx])...
这具有使用1或者无论位域是什么的效果,其有效地否定该场上的任何滤波器。
以上是关于如何仅使用在不使用动态SQL的情况下检查的复选框,将WHERE子句设置为在多个位列上进行过滤?的主要内容,如果未能解决你的问题,请参考以下文章
如何在不修改数据库模式的情况下仅使用 PL/SQL 更新具有大值的 CLOB?
如何在不导致400错误请求错误的情况下使用Python Flask“打开”复选框?