2009-03-14 7 views

Répondre

6

En supposant SQL Server:

Vous devez utiliser SQL dynamique. Construisez 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. Vous devriez éviter le SQL dynamique si possible.

0

Puisque vous ne spécifiez pas ce backend SQL que vous allez contre, ce sera difficile de répondre correctement ....

En ce qui concerne Je peux dire, vous ne serez pas en mesure de le faire ni contre MS SQL Server, ni contre Interbase/Firebird. Je ne peux pas parler pour les autres serveurs back-end, mais ...

Marc

0

Je pense qu'il est assez sûr de dire que la réponse est rien. Et c'est indépendamment du dialecte SQL.

22

Je ne crois pas que ce soit possible. D'une part, les optimiseurs de requête supposent une liste spécifique d'éléments semblables à des tables dans la clause FROM.

La solution la plus simple que 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; 

moitié seulement de l'UNION pourrait être vrai, étant donné le prédicat @ClientType.

+0

Je avais l'habitude d'écrire une instruction if, mais en utilisant cette stratégie combinée à un « insérer dans » il me évite d'avoir à écrire la partie insertion plusieurs fois, aimer cette solution merci, le fera de cette façon à partir de maintenant lorsque cela est possible. :) –

+0

Sachez simplement que la condition 'WHERE' est exécutée pour chaque ligne de la table. Donc, ce n'est peut-être pas une option si la condition est un peu plus compliquée et qu'il y a des millions de lignes. –

1

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

Cela devrait le faire, si vous êtes à la recherche d'une seule 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 
+0

En tant que «long-handed», c'est l'approche que je prendrais (mais il n'y a plus de votes: - /). Je préfèrerais utiliser un outil pour générer le SQL de façon statique (ce qui est quoi, 3 lignes de Ruby ou 1 ligne de Perl? :-) par rapport à SQL dynamique (quand j'ai _need_ SQL dynamique, je ne trouve rien d'autre que de la haine besoin de SQL dynamique). –

Questions connexes