Pergunta

Eu gostaria de criar um procedimento armazenado com parâmetros que indicam quais campos devem ser selecionado.

por exemplo. Eu gostaria de passar dois parâmetros "selectField1" e "selectField2" cada um como bools.

Então eu quero algo como

SELECT

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

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

FROM Table

Graças Karl

Foi útil?

Solução

Parece que eles querem que a capacidade de retornar campos só é permitido, o que significa que o número de campos retornados também tem que ser dinâmico. Isto irá funcionar com 2 variáveis. mais nada do que isso estará recebendo 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 vai ajudar com múltiplos. Este exemplo está a assumir pelo menos uma coluna é verdadeiro.

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)

Outras dicas

Em SQL, você fazê-lo desta maneira:

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

O modelo relacional não implica contagem campo dinâmico.

Em vez disso, se você não está interessado em um valor de campo, basta selecionar um NULL vez e analisá-lo no cliente.

Você quer que a CASE declaração :

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

EDIT: Meu exemplo é para combinar os dois campos em um campo, dependendo dos parâmetros fornecidos. É um um-ou-não solução (não ambos). Se você quiser a possibilidade de ter ambos os campos na saída, solução de uso do Quassnoi.

@selectField1 AS bit
@selectField2 AS bit

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

É isso que você está procurando?

Esta é uma maneira pseudo de fazê-lo

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

o que você quer é:

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

no seleto

No entanto, y que você não apenas não mostrar essa coluna em seu programa?

A forma do noob para fazer isso:

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

Você pode gerenciar essas informações corretamente na linguagem de programação única a fazer um if-else.

Exemplo em 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top