Я пытаюсь отфильтровать результаты оператора select с помощью флажков и параметров с помощью элемента управления SqlDataSource.
Проблема в том, что параметры не могут быть неопределенными, и я хочу, чтобы любой из заданных параметров равнялся "1" или "True", если они определены. В любое другое время их вообще не следует использовать в предложении WHERE (или, возможно, установить что-то вроде «IS NOT NULL»).
По существу, когда флажок установлен, предложение WHERE должно включать параметр, связанный с этим флажком, а значение параметра должно быть «1» (True), в противном случае, если флажок находится в каком-либо другом состоянии, «не проверено» "or" undefined "предложение WHERE вообще не должно включать параметр для этого флажка, или ему следует установить какое-то значение, которое по существу выбирает либо" 1 "(True), либо" 0 "(False).
Я попытался поиграть с предложением 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.
Любая помощь будет принята с благодарностью.