如何仅使用在不使用动态SQL的情况下检查的复选框,将WHERE子句设置为在多个位列上进行过滤?

问题描述 投票:1回答:1

我试图使用带有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查询。

任何帮助将不胜感激。

c# sql asp.net checkbox sqldatasource
1个回答
2
投票

如果未选中框,请将其设置为参数值DBNull.Value。然后在WHERE条款中为每个执行此操作

... AND BitFieldX = ISNULL(@BitFieldX, [BitFieldx])...

这具有使用1或者无论位域是什么的效果,其有效地否定该场上的任何滤波器。

© www.soinside.com 2019 - 2024. All rights reserved.