2009-06-24 9 views
25

Me gustaría crear un procedimiento almacenado con parámetros que indiquen qué campos se deben seleccionar.SQL condicional SELECCIONAR

E.g. Me gustaría pasar dos parámetros "selectField1" y "selectField2" cada uno como bools.

entonces yo quiero algo así como

SELECT 

if (selectField1 = true) Field1 ELSE do not select Field1 

if (selectField2 = true) Field2 ELSE do not select Field2 

FROM Table 

Gracias Karl

Respuesta

9

Parece que quieren la capacidad de devolver solo los campos permitidos, lo que significa que el número de campos devueltos también tiene que ser dinámico. Esto funcionará con 2 variables. Cualquier cosa más que eso se volverá confuso.

IF (selectField1 = true AND selectField2 = true) 
BEGIN 
    SELECT Field1, Field2 
    FROM Table 
END 
ELSE IF (selectField1 = true) 
BEGIN 
    SELECT Field1 
    FROM Table 
END 
ELSE IF (selectField2 = true) 
BEGIN 
    SELECT Field2 
    FROM Table 
END 

SQL dinámico ayudará con múltiplos. Este ejemplo asume que al menos 1 columna es verdadera.

DECLARE @sql varchar(MAX) 
SET @sql = 'SELECT ' 
IF (selectField1 = true) 
BEGIN 
    SET @sql = @sql + 'Field1, ' 
END 
IF (selectField2 = true) 
BEGIN 
    SET @sql = @sql + 'Field2, ' 
END 
... 
-- DROP ', ' 
@sql = SUBSTRING(@sql, 1, LEN(@sql)-2) 

SET @sql = @sql + ' FROM Table' 

EXEC(@sql) 
+0

Lo que quiero hacer es en realidad mucho más complejo que simplemente elegir seleccionar uno o dos campos. Tengo un montón de campo que tengo que ser capaz de seleccionar de forma dinámica, así como hacer una DONDE en ciertos campos, por ejemplo: @ whereField1 = 1 @ whereField2 = 1 @ whereField3 = 0 etc. y luego haga un DONDE en el Campo1 solo si @ donde Campo1 = 1 etc. Me parece que su segundo ejemplo podría ser la única manera de realmente hacer esto. ¿Cuántos caracteres es varchar (MAX)? – Karl

+0

SQL 2005 puede almacenar hasta 8000 caracteres. –

+0

@Justin varchar (max) en SQL2005 no está limitado a 8000 caracteres. varchar (max) se introdujo en SQL 2005 como un tipo de reemplazo de tipo de datos de texto con el apoyo de funciones disponibles para varchar. – kristof

48

En SQL, lo haces de esta manera:

SELECT CASE WHEN @selectField1 = 1 THEN Field1 ELSE NULL END, 
     CASE WHEN @selectField2 = 1 THEN Field2 ELSE NULL END 
FROM Table 

modelo relacional no implica recuento campo dinámico.

En su lugar, si no está interesado en un valor de campo, simplemente seleccione un NULL y analícelo en el cliente.

+0

Esto es más eficiente y limpio, pero lo que si NULL es un valor válido posible que uno de sus campos opcionales? ¿Analizarías los nombres de campo posiblemente? – PapillonUK

15

desea que el CASE statement:

SELECT 
    CASE 
    WHEN @SelectField1 = 1 THEN Field1 
    WHEN @SelectField2 = 1 THEN Field2 
    ELSE NULL 
    END AS NewField 
FROM Table 

EDIT: Mi ejemplo es la combinación de los dos campos en un campo, dependiendo de los parámetros proporcionados. Es una solución one-or- (no ambas). Si desea la posibilidad de tener ambos campos en la salida, use la solución de Quassnoi.

+0

Hago esto a menudo, aunque SQL tiene problemas para almacenar en caché las instrucciones, pero no se puede evitar. – Kezzer

+0

Eso puede fallar si las columnas son de tipo diferente, p. int vs char – kristof

0

Esta es una manera de hacerlo pseudo

IF (selectField1 = true) 
SELECT Field1 FROM Table 
ELSE 
SELECT Field2 FROM Table 
0

lo que desea es:

MY_FIELD= 
     case 
      when (selectField1 = 1) then Field1 
           else Field2   
     end, 

en el selecto

Sin embargo, y qué no sólo no muestra que la columna en tu programa?

2
@selectField1 AS bit 
@selectField2 AS bit 

SELECT 
CASE 
    WHEN @selectField1 THEN Field1 
    WHEN @selectField2 THEN Field2 
    ELSE someDefaultField 
END 
FROM Table 

Es esto lo que está buscando?

-1

La forma novato para hacer esto:

SELECT field1, field2 FROM table WHERE field1 = TRUE OR field2 = TRUE 

Puede administrar esta información correctamente en el lenguaje de programación sólo hacer un if-else.

ejemplo en ASP/JavaScript

// Code to retrieve the ADODB.Recordset 
if (rs("field1")) { 
    do_the_stuff_a(); 
} 
if (rs("field2")) { 
    do_the_stuff_b(); 
} 
rs.MoveNext();