web-dev-qa-db-fra.com

Quel est le but de l'utilisation de WHERE 1 = 1 dans les instructions SQL?

Doublons possibles:
Pourquoi une requête SQL aurait "où 1 = 1"
Pourquoi quelqu'un utiliserait-il WHERE 1 = 1 AND <conditions> dans une clause SQL?

J'ai vu cela dans différents exemples de requêtes et cela va probablement à tous les moteurs SQL.

S'il y a une requête qui n'a pas de conditions définies, les personnes (et spécialement les frameworks ORM) ajoutent souvent une condition toujours vraie WHERE 1 = 1 ou quelque chose comme ça.

Donc au lieu de

SELECT id, name FROM users;

ils utilisent

SELECT id, name FROM users WHERE 1 = 1;

La seule raison possible à laquelle je pourrais penser si vous ajoutez des conditions dynamiquement, vous n'avez pas à vous soucier de supprimer le AND initial, mais encore assez souvent ce 1 = 1 la condition est supprimée s'il existe une condition réelle dans la requête.

Exemple réel de CakePHP (généré par le framework):

(pas de conditions)

SELECT `User`.`id`, `User`.`login`
FROM `users` AS `User` WHERE 1 = 1 
ORDER BY `User`.`id` ASC;

(avec condition)

SELECT `User`.`id`, `User`.`login`
FROM `users` AS `User` 
WHERE `User`.`login` = '[email protected]'
LIMIT 1;

Y a-t-il une raison pour ajouter cette condition supplémentaire?

14
RaYell

Oui, c'est généralement parce que cela commence par "où 1 = 0", pour forcer l'échec de l'instruction.

C'est une façon plus naïve de l'envelopper dans une transaction et de ne pas la valider à la fin, pour tester votre requête. (C'est la méthode préférée).

6
Noon Silk

C'est aussi une pratique courante lorsque les gens sont construction de la requête SQL par programmation, il est juste plus facile de commencer par 'où 1 = 1' puis d'ajouter 'et customer.id =: custId' selon si un id client est fourni. Vous pouvez donc toujours ajouter la partie suivante de la requête en commençant par 'et ...'.

18
HeDinges

1 = 1 est ignoré par tous les rdbms. Il n'y a pas de compromis à exécuter une requête avec WHERE 1 = 1.

Construire des conditions WHERE dynamiques, comme les frameworks ORM ou autres le font très souvent, il est plus facile d'ajouter les conditions réelles où parce que vous évitez de vérifier pour ajouter un - ET à l'état actuel.

stmt += "WHERE 1=1";
if (v != null) {
   stmt += (" AND col = " + v.ToString());
}

Voici à quoi cela ressemble sans 1 = 1.

var firstCondition = true;
...
if (v != null) {
   if (!firstCondition) {
      stmt += " AND ";
   }
   else {
       stmt += " WHERE ";
       firstCondition = false;
   }
   stmt += "col = " + v.ToString());
}
8
Christian13467

Les gens l'utilisent parce qu'ils sont intrinsèquement paresseux lors de la création de requêtes SQL dynamiques. Si vous commencez par un "where 1 = 1" alors toutes vos clauses supplémentaires commencent simplement par "and" et vous n'avez pas à comprendre.

Non pas qu'il y ait quelque chose de mal à être intrinsèquement paresseux. J'ai vu des listes doublement liées où une liste "vide" se compose de deux nœuds sentinelles et vous commencez le traitement au first->next jusqu'au last->prev inclus.

Cela a en fait supprimé tout le code de gestion spécial pour la suppression des nœuds first et last. Dans cette configuration, le nœud every était un nœud intermédiaire car vous ne pouviez pas supprimer first ou last. Deux nœuds ont été gaspillés mais le code était plus simple et (très légèrement) plus rapide.

Le seul autre endroit où j'ai jamais vu la construction "1 = 1" est dans BIRT. Les rapports utilisent souvent des paramètres de position et sont modifiés avec Javascript pour autoriser toutes les valeurs. Donc la requête:

select * from tbl where col = ?

lorsque l'utilisateur sélectionne "*" pour le paramètre utilisé pour col est modifié comme suit:

select * from tbl where ((col = ?) or (1 = 1))

Cela permet à la nouvelle requête d'être utilisée sans tripoter les détails des paramètres positionnels. Il existe toujours exactement un de ces paramètres. Tout SGBD décent (par exemple, DB2/z) optimisera cette requête pour supprimer essentiellement la clause avant d'essayer de construire un plan d'exécution, il n'y a donc pas de compromis.

8
paxdiablo

L'utilisation de 1 = 1 n'est en fait pas une très bonne idée car cela peut provoquer des analyses de table complètes par lui-même.

Voir ceci -> T-SQL 1 = 1 hit de performance

3
Bhaskar

Comme tu dis:

si vous ajoutez des conditions de manière dynamique, vous n'avez pas à vous soucier de supprimer la valeur initiale ET c'est la seule raison qui pourrait être, vous avez raison.

1
Wael Dalloul