SELECT conditionnel SQL
-
10-07-2019 - |
Question
Je souhaite créer une procédure stockée avec des paramètres indiquant les champs à sélectionner.
E.g. Je souhaite transmettre deux paramètres "selectField1". et " selectField2 " chacun comme bool.
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
La solution
On dirait qu'ils veulent pouvoir uniquement renvoyer des champs autorisés, ce qui signifie que le nombre de champs retournés doit également être dynamique. Cela fonctionnera avec 2 variables. Quelque chose 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
Le SQL dynamique aidera avec les multiples. Cet exemple suppose qu'au moins une colonne 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)
Autres conseils
Dans SQL
, 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 nombre de champs dynamique.
Au lieu de cela, si une valeur de champ ne vous intéresse pas, il vous suffit de sélectionner NULL
et de l'analyser sur le client.
Vous souhaitez que la déclaration CASE
:
SELECT
CASE
WHEN @SelectField1 = 1 THEN Field1
WHEN @SelectField2 = 1 THEN Field2
ELSE NULL
END AS NewField
FROM Table
EDIT: Mon exemple concerne la combinaison des deux champs en un seul, en fonction des paramètres fournis. Il s’agit d’une solution un ou un (pas les deux). Si vous voulez avoir la possibilité d’avoir les deux champs dans la sortie, utilisez la solution de Quassnoi.
@selectField1 AS bit
@selectField2 AS bit
SELECT
CASE
WHEN @selectField1 THEN Field1
WHEN @selectField2 THEN Field2
ELSE someDefaultField
END
FROM Table
Est-ce ce que vous cherchez?
C’est une pseudo façon de le faire
IF (selectField1 = true)
SELECT Field1 FROM Table
ELSE
SELECT Field2 FROM Table
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 cette colonne dans votre programme?
La façon noob de faire cela:
SELECT field1, field2 FROM table WHERE field1 = TRUE OR field2 = TRUE
Vous pouvez gérer ces informations correctement dans le langage de programmation en effectuant une opération if-else.
Exemple 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();