如何设置 WHERE 子句以仅使用选中的复选框过滤多位列而不使用动态 SQL?

How can I set the WHERE clause to filter on multiple bit columns using only checkboxes that are checked without using dynamic SQL?

我正在尝试使用带有 SqlDataSource 控件的复选框和参数来过滤 select 语句的结果。

问题是参数不能未定义,我只希望任何给定参数等于“1”或 "True"(如果已定义)。在任何其他时候,它们根本不应该在 WHERE 子句中使用(或者可能设置为 "IS NOT NULL" 之类的东西)。

本质上,当复选框被选中时,WHERE 子句应包含与该复选框关联的参数,并且参数的值应为“1”(真),否则,如果复选框处于任何其他状态, "unchecked" 或 "indeterminate" WHERE 子句根本不应包含该复选框的参数,或者应将其设置为本质上 select 为“1”(真)或“ 0"(假)。

我尝试通过添加括号、添加 "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         |

在我们的用户体验中,我们将有 3 个复选框,数据中每个 "BitField" 对应一个复选框。

如果用户选中 none 个复选框,搜索结果应该 return:

| 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 或其他有效否定该字段上的任何过滤器的任何位域的效果。