Pourquoi quelqu'un utiliserait-il WHERE 1=1 AND <conditions>
dans une clause SQL (Soit SQL obtenu via des chaînes concaténées, soit la définition de la vue)
J'ai vu quelque part que cela serait utilisé pour se protéger contre l'injection SQL, mais cela semble très étrange.
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.
Pourtant, je ne comprends pas pourquoi quelqu'un utiliserait cette construction pour définir une vue, ou l'utiliser dans une procédure stockée.
Prenez ceci par exemple:
CREATE VIEW vTest AS
SELECT FROM Table WHERE 1=1 AND table.Field=Value
sql
dynamic-sql
Bogdan Maxim
la source
la source
Réponses:
Si la liste des conditions n'est pas connue au moment de la compilation et est plutôt créée au moment de l'exécution, vous n'avez pas à vous soucier de savoir si vous avez une ou plusieurs conditions. Vous pouvez tous les générer comme:
et les concaténer tous ensemble. Au
1=1
début, l'initialeand
a quelque chose à associer.Je n'ai jamais vu cela utilisé pour n'importe quel type de protection contre les injections, car vous dites que cela ne semble pas aider beaucoup. Je l' ai vu utilisé comme commodité d'implémentation. Le moteur de requête SQL finira par ignorer le
1=1
donc il ne devrait avoir aucun impact sur les performances.la source
where 1=1
(Oracle) ouwhere true
(Postgres), je devrai vérifier pour chaque condition si c'est la première. Cela ne sert à rien, et cela n'ajoute que du code standard.Ajout d'un exemple de code à la réponse de Greg:
la source
Je l'ai vu utilisé lorsque le nombre de conditions peut être variable.
Vous pouvez concaténer des conditions à l'aide d'une chaîne "AND". Ensuite, au lieu de compter le nombre de conditions que vous transmettez, vous placez un "WHERE 1 = 1" à la fin de votre instruction SQL stock et ajoutez les conditions concaténées.
Fondamentalement, cela vous évite d'avoir à faire un test des conditions, puis à ajouter une chaîne "WHERE" devant elles.
la source
Cela semble être un moyen paresseux de toujours savoir que votre clause WHERE est déjà définie et vous permet de continuer à ajouter des conditions sans avoir à vérifier si c'est la première.
la source
where 1=1
(Oracle) ouwhere true
(Postgres), je devrai vérifier pour chaque condition si c'est la première. Cela ne sert à rien, et cela n'ajoute que du code standard.WHERE 1=1
le travail supplémentaire est de maintenir le même code à plusieurs endroits et de le lire dans tout votre SQL généré. Je suis plus paresseux que toi je pense!Indirectement pertinent: lorsque 1 = 2 est utilisé:
cela créera une nouvelle table avec le même schéma que l'ancienne table. (Très pratique si vous souhaitez charger des données pour les comparer)
la source
L'expression 1 = 1 est couramment utilisée dans le code SQL généré. Cette expression peut simplifier la génération de code SQL en réduisant le nombre d'instructions conditionnelles.
la source
En fait, j'ai vu ce genre de chose utilisé dans les rapports BIRT. La requête passée au runtime BIRT est de la forme:
et le '?' est remplacé lors de l'exécution par une valeur de paramètre réelle sélectionnée dans une liste déroulante. Les choix dans le menu déroulant sont donnés par:
afin que vous obteniez toutes les valeurs possibles plus "
*
". Si l'utilisateur sélectionne "*
" dans la liste déroulante (ce qui signifie que toutes les valeurs de a doivent être sélectionnées), la requête doit être modifiée (par Javascript) avant d'être exécutée.Depuis le "?" est un paramètre positionnel et DOIT y rester pour que d'autres choses fonctionnent, le Javascript modifie la requête pour qu'elle soit:
Cela supprime essentiellement l'effet de la clause where tout en laissant le paramètre positionnel en place.
J'ai également vu le cas AND utilisé par les codeurs paresseux lors de la création dynamique d'une requête SQL.
Supposons que vous devez créer dynamiquement une requête qui commence par
select * from t
et vérifie:certaines personnes ajouteraient le premier avec un OERE et les suivantes avec un ET ainsi:
Les programmeurs paresseux (et ce n'est pas nécessairement un mauvais trait) ne feraient pas de distinction entre les conditions ajoutées, ils commenceraient par
select * from t where 1=1
et ajouteraient simplement des clauses AND après cela.la source
where 1=1
(Oracle) ouwhere true
(Postgres), je devrai vérifier pour chaque condition si c'est la première. Cela ne sert à rien, et cela n'ajoute que du code standard.J'ai trouvé ce modèle utile lorsque je teste ou vérifie deux fois des choses sur la base de données, donc je peux commenter très rapidement d'autres conditions:
se transforme en:
la source
où 1 = 0, cela permet de vérifier si la table existe. Je ne sais pas pourquoi 1 = 1 est utilisé.
la source
Bien que je puisse voir que 1 = 1 serait utile pour le SQL généré, une technique que j'utilise en PHP consiste à créer un tableau de clauses, puis à le faire
évitant ainsi le problème d'avoir un ET avant ou arrière. Évidemment, cela n'est utile que si vous savez que vous allez avoir au moins une clause!
la source
Voici un exemple étroitement lié: utiliser une
MERGE
instruction SQL pour mettre à jour la cible déposée en utilisant toutes les valeurs de la table source où il n'y a pas d'attribut commun sur lequel se joindre, par exemplela source
J'ai vu des frameworks homespun faire des choses comme ça ( blush ), car cela permet d'appliquer des pratiques d'analyse paresseuse aux mots-clés
WHERE
etAND
Sql.Par exemple (j'utilise C # comme exemple ici), considérez l'analyse conditionnelle des prédicats suivants dans une requête SQL
string builder
:Le "bénéfice" de
WHERE 1 = 1
signifie qu'aucun code spécial n'est nécessaire:AND
est requis. Puisque nous avons déjà au moins un prédicat avec le1 = 1
, cela signifie queAND
c'est toujours OK.WHERE
doit être supprimé. Mais encore une fois, nous pouvons être paresseux, car nous sommes à nouveau garant d'au moins un prédicat.C'est évidemment une mauvaise idée et je recommanderais d'utiliser un cadre d'accès aux données ou ORM établi pour analyser les prédicats facultatifs et conditionnels de cette manière.
la source
WHERE 1=1
est un indicateur juste que ce n'est pas le cas, que la base de code est jonchée de bits de chaînesWHERE 1=1
, ce qui m'indiquerait un problème d'architecture d'application, et je ne devinerais pas le seul!Si vous êtes venu ici pour chercher
WHERE 1
, notez celaWHERE 1
et ilsWHERE 1=1
sont identiques.WHERE 1
est rarement utilisé car certains systèmes de base de données le rejettent en considérant qu'ilWHERE 1
n'est pas vraiment booléen.la source
Ceci est utile dans le cas où vous devez utiliser une requête dynamique dans laquelle, dans la clause where, vous devez ajouter des options de filtre. Comme si vous incluez les options 0 pour le statut est inactif, 1 pour actif. Sur la base des options, il n'y a que deux options disponibles (0 et 1) mais si vous souhaitez afficher tous les enregistrements, il est pratique d'inclure où fermer 1 = 1. Voir l'exemple ci-dessous:
la source
Après avoir passé en revue toutes les réponses, j'ai décidé d'effectuer une expérience comme
Puis j'ai vérifié avec d'autres numéros
ect Après avoir effectué toutes les vérifications, la ville d'exécution des requêtes est la même. même sans la clause where. Je ne suis pas fan de la syntaxe
la source
Je le fais généralement lorsque je crée du SQL dynamique pour un rapport contenant de nombreuses valeurs déroulantes qu'un utilisateur peut sélectionner. Étant donné que l'utilisateur peut ou non sélectionner les valeurs de chaque liste déroulante, nous finissons par avoir du mal à déterminer quelle condition était la première clause where. Donc, nous complétons la requête avec un
where 1=1
à la fin et ajoutons toutes les clauses where après cela.Quelque chose comme
Ensuite, nous construisions la clause where comme ceci et la transmettions comme valeur de paramètre
Comme la sélection de la clause where nous est inconnue au moment de l'exécution, cela nous aide beaucoup à déterminer s'il faut inclure un
'AND' or 'WHERE'.
la source
L'utilisation d'un prédicat comme
1=1
est un indice normal parfois utilisé pour forcer le plan d'accès à utiliser ou non une analyse d'index. La raison pour laquelle cela est utilisé est lorsque vous utilisez une requête jointe multi-imbriquée avec de nombreux prédicats dans la clause where où parfois même en utilisant tous les index, le plan d'accès lit chaque table - une analyse complète de la table. Ceci n'est qu'une des nombreuses astuces utilisées par les administrateurs de base de données pour inciter un dbms à utiliser un chemin plus efficace. N'en jetez pas un; vous avez besoin d'un dba pour analyser la requête car elle ne fonctionne pas toujours.la source
Voici un cas d'utilisation ... mais je ne suis pas trop préoccupé par les détails techniques de la raison pour laquelle je devrais ou non utiliser 1 = 1. J'écris une fonction, en utilisant pyodbc pour récupérer certaines données de SQL Server. Je cherchais un moyen de forcer un remplissage après le
where
mot - clé dans mon code. C'était vraiment une excellente suggestion:La raison en est que je n'ai pas pu implémenter le mot clé «where» ensemble dans la variable de clause _where. Donc, je pense que l'utilisation d'une condition fictive qui donne la valeur true ferait office de remplissage.
la source
Je suis tombé pour la première fois sur ce dos avec ADO et asp classique, la réponse que j'ai obtenue était: performance. si tu fais une ligne droite
Select * from tablename
et passez-le en tant que commande / texte sql, vous obtiendrez une augmentation notable des performances avec le
Where 1=1
ajouté, c'était une différence visible. quelque chose à voir avec le retour des en-têtes de table dès que la première condition est remplie, ou une autre folie, de toute façon, cela a accéléré les choses.
la source