Pourquoi utiliser WHERE 1 ou WHERE 1 = 1?


50

Généralement, si aucune condition n'est requise dans nos instructions de requête, nous n'utilisons pas de WHEREclause. Mais j'ai vu une WHERE 1clause être utilisée dans de nombreux endroits, même en l'absence d'autres conditions.

  • Pourquoi est-ce fait?
  • Y a-t-il des avantages spécifiques au temps d'exécution?
  • Cela permet-il d'autres fonctionnalités?
  • Est-ce que l'utilisation est WHERE 1=1semblable à celle-ci?

Réponses:


45

En gros, c'est simplement pour la commodité du programmeur puisque vous pouvez simplement ajouter des conditions supplémentaires AND...après cela et cela n'a aucun impact sur le temps d'exécution.

Découvrez ces liens vers Stackoverflow:

Notez que WHERE 1c'est identique à WHERE 1=1; les deux signifient WHERE TRUEmais le premier est rejeté par beaucoup de systèmes de gestion de base de données comme n'étant pas vraiment booléen.


16

Mon utilisation principale est qu'il est plus facile de commenter des choses lors du développement de requêtes. Je mène avec ,'s et and' s:

SELECT
     A
--  ,B
    ,C
    ,D
--  ,E
FROM TABLE
WHERE 1=1
--  and B='This'
    and C='That'
--  and D is not null

Il est également plus facile d’agir par programmation jusqu’à la fin.

this  = "SELECT * "
this += "FROM TABLE "
this += "WHERE 1=1 "
if user chooses option a then this += "and A is not null "
if user chooses option b then this += "and B is not null "
if user chooses option b then this += "and C is not null "
if user chooses option b then this += "and D is not null "

Sinon, vous devrez qualifier la première option ... et demander à chaque option suivante de cocher les options précédentes. Que se passe-t-il si l'utilisateur n'a choisi que l'option D dans l'exemple précédent? Vous devez vous assurer que vous if A, B and C aren't chosenutilisez ensuite une WHEREautre utilisation and. Au =début, vous pouvez simplement insérer les qualificatifs à la fin de la déclaration.


1
Et vous avez écrit ce code comme 1980 dans un langage sans orientation d'objet, avant que quiconque ait eu l'idée d'un générateur SQL basé sur des objets?
TomTom

J'écris codesemblable au premier bloc dans SSMS ou des outils de requête semblables. Recherchez des ensembles de données et obtenez les bons résultats avant de les intégrer aux outils de reporting (tels que Crystal Reports) pour les utilisateurs finaux. Le deuxième bloc correspond à ce que j'ai vu faire, car mon travail ne portait pas trop sur l'accès brut à SQL. J'ai perturbé le code similaire des autres peuples et je peux comprendre le raisonnement. (Le code était en VB, C # et PHP).
WernerCD

10

Pourquoi on fait ça?

La génération de code dynamique écrite par des programmeurs pas trop compétents me vient à l’esprit.

Génère SELECT .... WHERE et vous devez alors avoir QUELQUE CHOSE .... donc au lieu d’ajouter le WHERE uniquement lorsque cela est nécessaire, ils ajoutent une condition non limitante quand aucun n’est présent. Vu que - responsable du licenciement du "spécialiste".

Ou le gars juste des choses où est obligatoire;)

Je ne vois rien d'autre.


5

Je programmais un ensemble de fonctions définies par l'utilisateur en C ++ / C pour PostgreSQL qui étaient utilisées par d'autres personnes dans une grande entreprise (plus de 10 000 personnes). Mes fonctions ont un whereparamètre optionnel : si aucune valeur n'a été donnée, la clause n'a pas été utilisée. Cela a été explicitement documenté. Malheureusement, personne n’a utilisé cette fonctionnalité et tout le monde n’a fourni que des where 1=1clauses. Théoriquement, cela semble imprudent, pratiquement tous les optimiseurs de requêtes excluent ce type d’instruction. Et il est difficile d'éduquer 10 000 personnes.


3
Personne n'a jamais appelé votre FDU avec WHERE 1=1; DROP TABLE CUSTOMERS?
Twinkles

Néanmoins, je ne parviens pas à trouver les concepts sous-jacents à l’utilisation de la clause Where 1. Besoin de plus de précisions? Comme je n'ai pas eu d'amélioration du temps d'exécution.
ursitesion

Cela a peu à faire avec le temps d'exécution. Il faut faire avec la culture comment les gens programment. Il arrive parfois que votre code (programmé par le personnel informatique) soit utilisé par des ingénieurs. Ces gars ont leur propre façon de penser et d'invoquer votre code
arthur

@ Twinkles: c'est certainement une question intéressante. Il y a quelques points à noter ici. (i) la base de données est en lecture seule pour le fichier UDF. (ii) Ma fonction joint plusieurs groupes de tables et pour aggraver les choses, utilisez des fonctions de fenêtrage de stockage de données. Cela rend difficile de laisser tomber quoi que ce soit, bien que ce ne soit pas impossible, (iii) les FDU sont destinés au code de pré-production. Ce qui signifie qu’elle n’entre jamais dans la production: si la fonction survit au défi, un autre département réécrit complètement tout ce que nous avions programmé
arthur

4
En fait, il est assez facile d'éduquer 10 000 personnes. Faites que l'application échoue quand ils le font mal. Ils vont immédiatement arrêter de le faire mal.
Jasmine

2

L'utilisation de "où 1 = 1" réduit la complexité du code nécessaire à la génération d'une clause SQL dynamique 'where'. Sinon, lors de la création de la clause 'where', vous devrez vérifier s'il s'agit du premier composant ajouté à chaque composant. Il s'agit d'un modèle de code simple visant à réduire la complexité du code et la réduction de la complexité du code, dans la mesure du possible, constitue presque toujours la bonne décision.


0

Ici vous allez ... du point de vue de la programmation, une utilisation de 1 = 1 ...entrez la description de l'image ici

Dans une situation comme celle-ci, lorsque j'ai besoin de construire une requête au moment de l'exécution et qu'elle peut être courte ou longue, j'utilise 'où 1 = 1 AND'

string criteria =string.Empty;
        if (txtc1.Text != "")
        {
            criteria += "criteria1=" + "'" + txtc1.Text + "' ";
        }
        if (txtc2.Text != "")
        {
            criteria += "OR criteria2=" + "'" + txtc2.Text + "' ";
        }
        if (ddl1.SelectedItem.Text != "")
        {
            criteria += "OR criteria3=" + "'" + ddl1.SelectedItem.Text + "' ";
        } if (ddl2.SelectedItem.Text != "")
        {
            criteria += "OR criteria4=" + "'" + ddl2.SelectedItem.Text + "' ";
        }
        if (ddl3.SelectedItem.Text != "")
        {
            criteria += "OR criteria5=" + "'" + ddl3.SelectedItem.Text + "' ";
        }
        if (ddl4.SelectedItem.Text != "")
        {
            criteria += "OR criteria6=" + "'" + ddl4.SelectedItem.Text + "' ";

        } 
        if (txtc1.Text == "")  
        {
            //criteria = criteria.Substring(2);
            criteria = criteria.Substring(2,criteria.Length-3);
        }
        if (criteria != string.Empty)
        {
            criteria = "where 1=1 AND " + criteria;
            //Response.Write("<script>alert('query constructed by you is : '+'" +criteria+ "');</script>");
            Response.Write(criteria);
        }

Rendre les choses plus faciles

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.