Wat is het doel van het gebruik van waar 1 = 1 in SQL-instructies? [DUPLICEER]

mogelijke duplicaten:
Waarom zou een SQL-query “hebben” waar 1 = 1 “

Ik heb dat veel in verschillende query-voorbeelden gezien en het gaat naar waarschijnlijk alle SQL-motoren.

Als er een query is die geen voorwaarden heeft gedefinieerd, voegen mensen (en speciaal orm-frameworks) vaak altijd-echte toestand toe WHERE 1 = 1of zoiets.

Dus in plaats van

SELECT id, name FROM users;

ze gebruiken

SELECT id, name FROM users WHERE 1 = 1;

De enige mogelijke reden waarom ik zou kunnen bedenken Als u voorwaarden dynamisch toevoegt, hoeft u zich geen zorgen te maken over het strippen van de initiële ANDmaar nog steeds vrij vaak dit 1 = 1Voorwaarde wordt gestript als er een daadwerkelijke aandoening in de query is.

Actuele voorbeeld van CakePhP (gegenereerd door framework):

(geen voorwaarden)

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

(met voorwaarde)

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

Is er een reden voor het toevoegen van die extra voorwaarde?


Antwoord 1, Autoriteit 100%

Ja, het is meestal omdat het begint als ‘waar 1 = 0’, om het statement te laten mislukken.

Het is een meer naïeve manier om het in een transactie te verpakken en het aan het einde niet vast te leggen, om uw zoekopdracht te testen. (Dit is de voorkeursmethode).


Antwoord 2, autoriteit 97%

Het is ook gebruikelijk wanneer mensen de sql-query programmatisch bouwen, het is gewoon makkelijker om te beginnen met ‘where 1=1’ en dan ‘ en customer.id=:custId’ toe te voegen, afhankelijk van of een klant-ID wordt verstrekt.
U kunt dus altijd het volgende deel van de zoekopdracht toevoegen dat begint met ‘en …’.


Antwoord 3, autoriteit 92%

De 1=1wordt door altijd alle rdbms genegeerd. Er is geen afweging bij het uitvoeren van een zoekopdracht met WHERE 1=1.

Dynamische WHERE-voorwaarden bouwen, zoals ORM-frameworks of andere heel vaak doen, is het gemakkelijker om de realwhere-voorwaarden toe te voegen, omdat u niet hoeft te controleren of er een ANDaan de huidige staat.

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

Zo ziet het eruit zonder 1=1.

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

Antwoord 4, autoriteit 93%

Mensen gebruiken het omdat ze van nature lui zijn bij het bouwen van dynamische SQL-query’s. Als je begint met een "where 1 = 1"dan beginnen al je extra clausules gewoon met "and"en hoef je er niet achter te komen.

Niet dat er iets mis is met inherent lui zijn. Ik heb dubbel gekoppelde lijsten gezien waarbij een “lege” lijst uit twee schildwachtklieren bestaat en je begint met verwerken bij de first->nexttot last->previnclusief.

Hiermee is eigenlijk alle speciale verwerkingscode verwijderd voor het verwijderen van firsten lastknooppunten. In deze opzet was elkknooppunt een middelste knooppunt, aangezien u firstof lastniet kon verwijderen. Er waren twee knooppunten verspild, maar de code was eenvoudiger en (ooit zo iets) sneller.

De enige andere plaats waar ik ooit de constructie “1 = 1” heb gezien, is in BIRT. Rapporten gebruiken vaak positionele parameters en worden aangepast met Javascript om alle waarden toe te staan. Dus de vraag:

select * from tbl where col = ?

wanneer de gebruiker "*"selecteert voor de parameter die wordt gebruikt voor colwordt gewijzigd in:

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

Hierdoor kan de nieuwe query worden gebruikt zonder te rommelen met de positionele parameterdetails. Er is nog steeds precies één zo’n parameter. Elke fatsoenlijke DBMS (bijv. DB2/z) zal die query optimaliseren om de clausule in feite volledig te verwijderen voordat wordt geprobeerd een uitvoeringsplan op te stellen, dus er is geen compromis.


Antwoord 5, autoriteit 8%

Zoals je zei:

als u voorwaarden toevoegt
dynamisch hoeft u zich geen zorgen te maken
over het strippen van de eerste AND
dat is de enige reden zou kunnen zijn, je hebt gelijk.


Antwoord 6

Het gebruik van 1=1 is eigenlijk geen goed idee, omdat dit vanzelf volledige tabelscans kan veroorzaken.

Zie dit–> T-SQL 1=1 prestatiehit

Other episodes