web-dev-qa-db-fra.com

Est-il possible d'utiliser une instruction Case dans une clause SQL From

Est-il possible d'utiliser une déclaration de cas dans une sql clause From avec SQL 2005? Par exemple, j'essaie quelque chose comme:

SELECT Md5 FROM 
CASE
    WHEN @ClientType = 'Employee' THEN @Source = 'HR'
    WHEN @ClientType = 'Member' THEN  @Source = 'Other'
END CASE 
WHERE Current = 2;
21
Zambian

En supposant que SQL Server:

Vous auriez besoin d'utiliser du SQL dynamique. Générez la chaîne, puis appelez sp_executesql avec la chaîne.

Edit: Mieux encore, utilisez simplement les instructions if pour exécuter l'instruction appropriée et affecter la valeur à une variable. Si possible, évitez le SQL dynamique.

6
jhale

Je ne crois pas que ce soit possible. D'une part, les optimiseurs de requêtes supposent une liste spécifique d'éléments de type table dans la clause FROM.

La solution de contournement la plus simple à laquelle je peux penser serait une union entre les deux tables:

SELECT  md5
FROM    hr
WHERE   @clienttype = 'Employee'
AND     current = 2
UNION
SELECT  md5
FROM    other
WHERE   @clienttype = 'Member'
AND     current = 2;

Seule une moitié de l'UNION pourrait être True, étant donné le prédicat @clienttype.

23
yukondude

Non, vous ne pouvez pas choisir une table à interroger à l'aide d'une instruction CASE. Les instructions CASE ne vont que dans les expressions, comme pour la valeur d'une colonne ou dans le cadre de votre expression WHERE.

Cela devrait le faire, si vous recherchez juste une valeur:

IF @ClientType = 'Employee' BEGIN
    SET @Source = (SELECT Md5 FROM HR WHERE Current = 2)
END
ELSE IF @ClientType = 'Member' BEGIN
    SET @Source = (SELECT Md5 FROM Other WHERE Current = 2)
END
1
Kevin Conner

Puisque vous ne spécifiez pas le backend SQL que vous allez utiliser, il sera difficile de répondre correctement ....

Autant que je sache, vous ne pourrez le faire ni contre MS SQL Server, ni contre Interbase/Firebird. Je ne peux pas parler pour d'autres serveurs dorsaux, cependant ...

Marc

0
marc_s

Je pense qu'il est assez prudent de dire que la réponse est impossible. Et cela indépendamment du dialecte SQL.

0
Tor Haugen