Pregunta

Me gustaría crear un procedimiento almacenado con parámetros que indiquen qué campos deben seleccionarse.

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

Entonces quiero algo como

SELECT

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

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

FROM Table

Gracias Karl

¿Fue útil?

Solución

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

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

Dynamic SQL ayudará con los múltiplos. Este ejemplo supone 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)

Otros consejos

En SQL , lo hace de esta manera:

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

El modelo relacional no implica recuento de campo dinámico.

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

Desea la CASE declaración :

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

EDITAR: Mi ejemplo es para combinar los dos campos en un campo, dependiendo de los parámetros suministrados. Es una solución uno o ninguno (no ambos). Si desea la posibilidad de tener ambos campos en la salida, use la solución de Quassnoi.

@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ás buscando?

Esta es una pseudo manera de hacerlo

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

lo que quieres es:

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

en la selección

Sin embargo, ¿no acabas de mostrar esa columna en tu programa?

La forma novata de 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 solo haciendo 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();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top