web-dev-qa-db-fra.com

SELECT conditionnel SQL

Je voudrais créer une procédure stockée avec des paramètres qui indiquent quels champs doivent être sélectionnés.

Par exemple. Je voudrais passer deux paramètres "selectField1" et "selectField2" chacun comme bools.

Ensuite, je veux quelque chose comme

SELECT

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

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

FROM Table

Merci Karl

31
Karl

On dirait qu'ils veulent pouvoir renvoyer uniquement les champs autorisés, ce qui signifie que le nombre de champs retournés doit également être dynamique. Cela fonctionnera avec 2 variables. Rien de plus que cela deviendra déroutant.

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 vous aidera avec les multiples. Cet exemple suppose que la colonne au moins 1 est vraie.

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)
10
Justin Balvanz

Dans SQL, vous procédez comme suit:

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

Le modèle relationnel n'implique pas un comptage de champ dynamique.

Au lieu de cela, si vous n'êtes pas intéressé par une valeur de champ, il vous suffit de sélectionner un NULL à la place et de l'analyser sur le client.

59
Quassnoi

Vous voulez l'instruction CASE :

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

EDIT: Mon exemple est de combiner les deux champs en un seul champ, en fonction des paramètres fournis. Il s'agit d'une solution un ou aucun (pas les deux). Si vous voulez avoir la possibilité d'avoir les deux champs dans la sortie, utilisez la solution de Quassnoi.

21
Welbog
@selectField1 AS bit
@selectField2 AS bit

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

C'est ce que vous cherchez?

2
l3a0

C'est une pseudo façon de le faire

IF (selectField1 = true) 
SELECT Field1 FROM Table
ELSE
SELECT Field2 FROM Table
0
Daniel A. White

ce que vous voulez c'est:

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

dans la sélection

Cependant, vous ne montrez pas simplement cette colonne dans votre programme?

0
waqasahmed