SELECCIÓN condicional de SQL
-
10-07-2019 - |
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
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();