2010-03-15 9 views
2

Supposons que nous devions vérifier trois conditions booléennes pour effectuer une requête de sélection. Laissez les trois drapeaux être «A», «B» et «C».construction dynamique En instructions avec sql

Si tous les trois indicateurs sont définis sur '1', la requête à générer est SELECT * FROM Food WHERE Nom In ('Apple,' Biscuit ',' Chocolat '); Si seuls les drapeaux «A» et «B» sont mis à «1» avec C mis à «0». Ensuite, la requête suivante est générée.

SELECT * 
    FROM Food 
WHERE Name In ('Apple, 'Biscuit'); 

Quelle est la meilleure façon de le faire?

+0

Pensiez-vous de construire cette SQL dynamique dans un langage de programmation informatique? Un particulier? –

+0

Le dialecte SQL à utiliser est T-SQL. – TrustyCoder

+1

T-SQL signifie Sybase et/ou SQL Server –

Répondre

2
SELECT * 
    FROM Food 
WHERE (Name = 'Apple' AND <condition A>) 
    OR (Name = 'Biscuit' AND <condition B>) 
    OR (Name = 'Chocolate' AND <condition C>) 

Maintenant, tout en étant correct cela est pas souhaitable du point de vue de la performance car les conditions A, B et C ne sont pas orientées données (ils ne changent pas d'une ligne à). Vous pouvez donc utiliser des permutations de toutes les conditions possibles en construisant SQL dynamiquement - utilisez la clause IN et construisez dynamiquement sa chaîne.

Une autre solution est l'assemblage résultat final dans le client en exécutant chaque SELECT séparément (pseudo-code):

if A then { 
    result1 = execute("SELECT * FROM Food WHERE Name = 'Apple') 
} 
if B then { 
    result2 = execute("SELECT * FROM Food WHERE Name = 'Biscuit') 
} 
if C then { 
    result2 = execute("SELECT * FROM Food WHERE Name = 'Chocolate') 
} 

result = join(result1, result2, result3) 

Cette solution peut fonctionner lorsque vous avez le pourcentage élevé de cas avec seulement une ou deux vraies conditions .

+0

J'aime la première solution, la seconde engendre plus de frais généraux. – TrustyCoder

0

Vous devez d'abord vérifier si tous sont faux et afficher une erreur. Ou peut-être pas si c'est acceptable dans votre cas.

Ensuite, si ces drapeaux ne sont que des variables bool ne (pseudocode)

sql = "SELECT * 
    FROM Food 
WHERE Name In ("; 
if (A) sql += "'Apple', " 
if (B) sql += "'Biscuit', " 
if (C) sql += "'Chocolate', " 
sql = sql.deleteLastCharacter() + ");"; 
0

Pourquoi ne pas inclure A/B/C dans la requête? sélectionnez * dans les aliments où (nom = 'Pomme' ou PAS A) et (nom = 'Biscuit' OU PAS B) ...

0

Je pense que cela devrait être lu: Dynamic SQL.

La procédure stockée système sp_executesql se révèle également très utile.