2012-05-16 13 views
12

¿Cómo se puede consultar una columna para cualquier valor en esa columna? (es decir, ¿cómo puedo construir una cláusula where dinámica que puede filtrar el valor, o no)?¿Cómo consulta una columna int para cualquier valor?

Quiero poder consultar un valor específico, o no. Por ejemplo, podría querer que el valor sea 1, pero podría querer que sea cualquier número.

¿Hay alguna manera de usar un comodín (como "*"), para que coincida con cualquier valor, para que pueda insertarse dinámicamente donde no quiero filtro?

Por ejemplo:

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 

La razón por la que no quiero usar 2 sentencias SQL separadas es porque estoy usando esto como una fuente de datos SQL, que sólo puede tener 1 instrucción de selección.

+1

¿Un comodín para qué? Puede hacer 'WHERE col = 1',' WHERE col> 2', 'WHERE col IN (3,4)', etc. Pero los comodines son para cadenas. ¿Qué estás tratando de hacer exactamente? – bfavaretto

+0

¿Puede proporcionar un conjunto de datos de ejemplo y un resultado? Si desea permitir cualquier valor, simplemente no lo incluya en una cláusula where. – driis

+0

Ok, agregué un ejemplo. – Bill

Respuesta

32

A veces consultaría el valor real (como 1, 2 ...) por lo que tampoco puedo tener una condición.

I le desea un comportamiento dinámico en su cláusula WHERE, sin tener que construir dinámicamente su cláusula WHERE.

Con un solo parámetro, puede utilizar ISNULL (o COALESCE) así:

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

que permite un parámetro NULL para que coincida con todos. Algunos prefieren el más largo pero más explícito:

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

Sí, tengo que funcionar, aceptaré la respuesta en 3 minutos después de que esté disponible. – Bill

1

Puede utilizar el parámetro como un comodín mediante la asignación de un significado especial a NULL:

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

esta manera, cuando se pasa en NULL; obtienes todas las filas

Si NULL es un valor válido para consultar, entonces necesita usar dos parámetros.

+0

Pero, ¿qué ocurre cuando necesito consultar un valor específico? – Bill

+0

Creo que entiendo lo que quieres decir ahora. Lo más fácil es realmente omitir la parte predicada, como mencionan otros, pero actualicé mi respuesta con una posible solución para su caso de uso. – driis

6

Una respuesta simple sería usar: IS NOT NULL. Pero si está pidiendo digamos 123 * para números como 123456 o 1234 o 1237, entonces podría convertirlo a varchar y luego probarlo contra el uso de comodines estándar.

En su cláusula where: cast(myIntColumn as varchar(15)) like '123%'.

0

El equivalente de comodines para números son los comparadores.

lo tanto, si desea encontrar todos los números enteros positivos:

select int_col from table where int_col > 0 

cualquier número entre cien y mil:

select int_col from table where int_col BETWEEN 100 AND 1000 

y así sucesivamente.

1

No entiendo muy bien lo que está preguntando. Creo que deberías usar dos consultas diferentes para las diferentes situaciones que tienes.

cuando no se está en busca de un valor específico:

SELECT * FROM table 

Cuando se busca un valor específico:

SELECT * FROM table WHERE intcol = 1 
+1

El origen de datos SQL solo tiene 1 declaración de selección. – Bill

3

Suponiendo que el valor que está filtrando en es un parámetro en un procedimiento almacenado, o está contenido en una variable llamada @Value, puede hacerlo así:

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

Si @Value es nulo, la parte or de la cláusula se ignora, por lo que la consulta no se filtrará en intCol.

+0

Sí, igual que con la respuesta de Mark. – Bill

1

Si realmente desea que el valor de su columna para todas las filas en la tabla puede simplemente usar

select int_col 
    from table 

Si quieres conocer todos los valores distintos , pero no importa cuántas veces que están repetidos puede utilizar

select distinct int_col 
    from table 

y si quieres conocer todos los valores distintos y cuántas veces cada uno aparecen ellos, utilizan

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

Para que los valores ordenados adecuadamente puede agregar

order by int_col 

a todas las consultas anteriores.

Comparte y disfruta.

Cuestiones relacionadas