Как настроить предложение WHERE для фильтрации по нескольким битовым столбцам, используя только флажки, которые отмечены без использования динамического SQL? - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь отфильтровать результаты оператора 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.

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 18 января 2019

Если флажок не установлен, укажите значение его параметра DBNull.Value. Затем в предложении WHERE сделайте это для каждого

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

Это дает эффект использования 1 или любого другого битового поля, которое эффективно нейтрализует любой фильтр в этом поле.

...