284 votes

Pourquoi utiliserait-on WHERE 1=1 AND <conditions> dans une clause SQL ?

Pourquoi quelqu'un utiliserait-il WHERE 1=1 AND <conditions> dans une clause SQL (Soit du SQL obtenu par des chaînes concaténées, soit une définition de vue)

J'ai vu quelque part que cela serait utilisé pour se protéger contre l'injection SQL, mais cela semble très bizarre.

S'il y a injection WHERE 1 = 1 AND injected OR 1=1 aurait le même résultat que injected OR 1=1 .

Modification ultérieure : Qu'en est-il de l'utilisation dans une définition de vue ?


Merci pour vos réponses.

Quand même, Je ne comprends pas pourquoi quelqu'un utiliserait cette construction pour définir une vue, ou l'utiliserait dans une procédure stockée.

Prenons l'exemple suivant :

CREATE VIEW vTest AS
SELECT FROM Table WHERE 1=1 AND table.Field=Value

3 votes

"pourquoi quelqu'un utiliserait-il cette construction pour définir une vue" Probablement par habitude. Il n'offre aucun avantage fonctionnel dans les requêtes statiques.

0 votes

375voto

Greg Hewgill Points 356191

Si la liste des conditions n'est pas connue au moment de la compilation et qu'elle est plutôt construite au moment de l'exécution, vous n'avez pas à vous soucier de savoir si vous avez une ou plusieurs conditions. Vous pouvez les générer toutes de la même manière :

and <condition>

et les concaténer tous ensemble. Avec le 1=1 au départ, l'initiale and a quelque chose à quoi s'associer.

Je n'ai jamais vu ce produit utilisé pour une quelconque protection contre les injections, comme vous le dites, il ne semble pas que cela puisse aider beaucoup. I ont il est utilisé comme une commodité d'implémentation. Le moteur de requête SQL finira par ignorer l'élément 1=1 donc il ne devrait pas avoir d'impact sur les performances.

13 votes

Il est arrivé par le passé que SQL Server génère des plans médiocres lorsque cette technique est utilisée. Pour cette raison, je ne l'utilise plus, sauf si la requête vise à récupérer la définition du schéma.

3 votes

Approuvé. Votez pour la réponse à la question, mais je recommanderais de coder la requête correctement pour commencer plutôt que d'être paresseux.

36 votes

Parfois, il ne s'agit pas d'être paresseux, mais d'avoir un code plus propre.

120voto

Eduardo Molteni Points 23135

J'ajoute juste un exemple de code à la réponse de Greg :

dim sqlstmt as new StringBuilder
sqlstmt.add("SELECT * FROM Products")
sqlstmt.add(" WHERE 1=1") 

''// From now on you don't have to worry if you must 
''// append AND or WHERE because you know the WHERE is there
If ProductCategoryID <> 0 then
  sqlstmt.AppendFormat(" AND ProductCategoryID = {0}", trim(ProductCategoryID))
end if
If MinimunPrice > 0 then
  sqlstmt.AppendFormat(" AND Price >= {0}", trim(MinimunPrice))
end if

7 votes

C'est un peu bricolé, mais ça semble être une utilisation valide.

5 votes

Cela devrait être la réponse acceptée. La pratique n'est vraiment qu'une pirouette pour ne pas avoir à déterminer le nombre de conditionnelles que vous avez.

39voto

Carl Points 592

Je l'ai vu utilisé lorsque le nombre de conditions peut être variable.

Vous pouvez concaténer les conditions en utilisant une chaîne " AND ". Ensuite, au lieu de compter le nombre de conditions que vous faites passer, vous placez un "WHERE 1=1" à la fin de votre instruction SQL de base et vous lancez les conditions concaténées.

En gros, cela vous évite de devoir effectuer un test pour les conditions et d'ajouter une chaîne "WHERE" avant celles-ci.

28voto

duckworth Points 3156

Cela semble être une façon paresseuse de toujours savoir que votre clause WHERE est déjà définie et de vous permettre de continuer à ajouter des conditions sans avoir à vérifier si c'est la première.

15 votes

"Paresseux" J'aime à penser que c'est intelligent, pas paresseux. Vous évitez le code répétitif et les contrôles de condition inutiles. Sans être capable d'ajouter where 1=1 (Oracle) ou where true (Postgres), je devrai vérifier pour chaque condition si c'est la première. Cela ne sert à rien, et cela ne fait qu'ajouter du code passe-partout.

2 votes

L'écriture de code consiste souvent - sinon principalement - à gérer différentes conditions. C'est juste une autre condition qui doit être gérée, et je pense personnellement que c'est paresseux de polluer le SQL généré avec. Si vous architecturez votre code pour ajouter 'Where 1 = 1' à UN endroit, vous pourriez - avec peu d'effort supplémentaire - gérer la différence entre les conditions zéro et plusieurs à cet UN endroit de votre code. Je pense cependant que les défenseurs de l'option "Where 1 = 1" la saupoudrent partout dans leur code, ce qui m'amène à la conclusion que la paresse engendre la paresse.

0 votes

@JasonS La paresse est le père de l'invention.

17voto

aku Points 54867

L'expression 1 = 1 est couramment utilisée dans le code sql généré. Cette expression peut simplifier le code sql généré en réduisant le nombre de déclarations conditionnelles.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X