2012-05-16 2 views
12

Как вы можете запросить столбец для любого значения в этом столбце? (т. е. как создать динамическое предложение where, которое может либо отфильтровать значение, либо нет.)Как вы запрашиваете столбец int для любого значения?

Я хочу иметь возможность запрашивать либо определенное значение, либо нет. Например, мне может понадобиться значение 1, но я хочу, чтобы это было любое число.

Есть ли способ использовать wild card (например, «*»), чтобы соответствовать любому значению, чтобы его можно было динамически вставить, когда я не хочу фильтра?

Например:

select int_col from table where int_col = 1 // Query for a specific value 
select int_col from table where int_col = * // Query for any value 

Причина, почему я не хочу использовать 2 отдельные операторы SQL, потому что я использую это как SQL источника данных, который может иметь только 1 оператор выбора.

+1

Подстановочный знак для чего? Вы можете делать 'WHERE col = 1',' WHERE col> 2', 'WHERE col IN (3,4)' и т. Д. Но подстановочные знаки для строк. Что вы пытаетесь сделать точно? – bfavaretto

+0

Можете ли вы предоставить примерный набор данных и результат? Если вы хотите разрешить любое значение, просто не включайте его в предложение where. – driis

+0

Хорошо, я добавил пример. – Bill

ответ

32

Иногда я запрашивал бы фактическое значение (например, 1, 2 ...), поэтому у меня тоже не может быть условия.

Я понимаю, что вы хотите, чтобы некоторые динамические характеристики на вашем предложении WHERE, без необходимости динамически строить свой пункт WHERE.

С одним параметром, вы можете использовать ISNULL (или COALESCE), как это:

SELECT * FROM Table WHERE ID = ISNULL(@id, ID) 

, который позволяет параметр NULL соответствовать всем. Некоторые предпочитают более длинный, но более определенно:

SELECT * FROM Table WHERE (@id IS NULL) OR (ID = @id) 
+0

Да, заработал, я приму ответ в течение 3 минут после того, как он станет доступен. – Bill

1

Вы можете использовать параметр в качестве шаблона, присвоив специальное значение NULL:

DECLARE @q INT = 1 
SELECT * FROM table WHERE IntegerColumn = @q OR @q IS NULL 

Таким образом, когда вы передаете NULL; вы получаете все строки.

Если NULL является допустимым значением для запроса, вам необходимо использовать два параметра.

+0

Но как насчет того, когда мне нужно запрашивать определенное значение? – Bill

+0

Думаю, я понимаю, что вы имеете в виду сейчас. Самое простое - опустить предикатную часть, как говорят другие, но я обновил свой ответ с возможным решением для вашего случая использования. – driis

6

Простым ответом было бы использование: IS NOT NULL. Но если вы просите сказать 123 * для чисел вроде 123456 или 1234 или 1237, тогда вы можете преобразовать их в varchar, а затем протестировать против использования стандартных диких карт.

В вашем месте: cast(myIntColumn as varchar(15)) like '123%'.

0

Эквивалент подстановочных знаков для чисел - это компараторы.

Итак, если вы хотите найти все целые положительные числа:

select int_col from table where int_col > 0 

любых чисел между сто и тысячей:

select int_col from table where int_col BETWEEN 100 AND 1000 

и так далее.

1

Я не совсем понимаю, о чем вы спрашиваете. Я думаю, вы должны использовать два разных запроса для разных ситуаций, которые у вас есть.

Когда вы не ищете конкретное значение:

SELECT * FROM table 

Когда вы ищете конкретное значение:

SELECT * FROM table WHERE intcol = 1 
+1

Источник данных SQL имеет только 1 оператор выбора. – Bill

3

Предполагая, что значение, которое вы фильтрацию является параметром в хранимой процедуре или содержится в переменной с именем @Value, вы можете сделать это следующим образом:

select * from table where @Value is null or intCol = @Value 

Если @Value имеет значение null, то часть предложения or игнорируется, поэтому запрос не будет фильтроваться на intCol.

+0

Да, так же, как с ответом Марка. – Bill

1

Если вы действительно хотите, значение вашей колонки для всех строк на столе вы можете просто использовать

select int_col 
    from table 

Если вы хотите знать все различные значения , но не важно, сколько раз они повторяются вы можете использовать

select distinct int_col 
    from table 

и если вы хотите знать все различные значения, и сколько раз каждый из них появляются, используйте

select int_col, count(*) 
    from table 
    group by int_col 

Чтобы иметь значения, отсортированные правильно, вы можете добавить

order by int_col 

ко всем выше запросов.

Делитесь и наслаждайтесь.

Смежные вопросы