320

Why would someone use WHERE 1=1 AND <conditions> in a SQL clause (Either SQL obtained through concatenated strings, either view definition)

I've seen somewhere that this would be used to protect against SQL Injection, but it seems very weird.

If there is injection WHERE 1 = 1 AND injected OR 1=1 would have the same result as injected OR 1=1.

Later edit: What about the usage in a view definition?


Thank you for your answers.

Still, I don't understand why would someone use this construction for defining a view, or use it inside a stored procedure.

Take this for example:

CREATE VIEW vTest AS
SELECT FROM Table WHERE 1=1 AND table.Field=Value
2
  • 4
    "why would someone use this construction for defining a view" Probably out of habit. It offers no functional advantage in static queries.
    – ADTC
    Commented Jul 30, 2014 at 5:47
  • Nobody should use Dynamic SQL
    – user2188550
    Commented Oct 15, 2019 at 19:24

21 Answers 21

402

If the list of conditions is not known at compile time and is instead built at run time, you don't have to worry about whether you have one or more than one condition. You can generate them all like:

and <condition>

and concatenate them all together. With the 1=1 at the start, the initial and has something to associate with.

I've never seen this used for any kind of injection protection, as you say it doesn't seem like it would help much. I have seen it used as an implementation convenience. The SQL query engine will end up ignoring the 1=1 so it should have no performance impact.

18
  • 42
    Sometimes is not about being lazy, but having a cleaner code. Commented Oct 28, 2008 at 10:55
  • 44
    dealing with trailing ANDs or COMMAs isn't dirty... nothing is cleaner by having 1=1 all over your SQL.
    – Mark Brady
    Commented Oct 28, 2008 at 22:01
  • 24
    DBAs? What are they for? :) Commented Oct 29, 2008 at 17:22
  • 43
    DBA's are there to clean up after programmers who think they know how to use databases effectively. Commented Dec 11, 2009 at 10:46
  • 29
    "Lazy" I like to think it's smart, not lazy. You're avoiding repetitive code and unnecessary condition checks. Without being able to add where 1=1 (Oracle) or where true (Postgres), I will have to check for each condition whether it is the first one. There is no point in doing so, and it only adds more boilerplate code.
    – ADTC
    Commented Jul 30, 2014 at 5:58
133

Just adding a example code to Greg's answer:

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
2
  • 8
    bit hacky, but seems like a valid use.
    – Mike
    Commented Dec 11, 2009 at 10:04
  • 5
    This should be the accepted answer. The practice is really only hack around to not having to determine how many conditionals you have.
    – aglassman
    Commented Apr 9, 2013 at 19:05
41

I've seen it used when the number of conditions can be variable.

You can concatenate conditions using an " AND " string. Then, instead of counting the number of conditions you're passing in, you place a "WHERE 1=1" at the end of your stock SQL statement and throw on the concatenated conditions.

Basically, it saves you having to do a test for conditions and then add a "WHERE" string before them.

0
29

Seems like a lazy way to always know that your WHERE clause is already defined and allow you to keep adding conditions without having to check if it is the first one.

4
  • 16
    "Lazy" I like to think it's smart, not lazy. You're avoiding repetitive code and unnecessary condition checks. Without being able to add where 1=1 (Oracle) or where true (Postgres), I will have to check for each condition whether it is the first one. There is no point in doing so, and it only adds more boilerplate code.
    – ADTC
    Commented Jul 30, 2014 at 5:56
  • 2
    @ADTC Writing code is often - if not mostly - about handling different conditions. This is just another condition that needs to be handled, which I personally think is lazy to pollute generated SQL with. If you architect your code to add 'Where 1 = 1' in ONE place, you could - with little extra effort - handle the difference between zero and many conditions in that ONE place in your code. My guess is though, advocates for 'Where 1 = 1' sprinkle it throughout their codebase, which brings me to the conclusion laziness breeds laziness.
    – Jason S
    Commented Feb 22, 2016 at 6:51
  • @JasonS Laziness is the father of Invention.
    – ADTC
    Commented Feb 22, 2016 at 9:05
  • @ADTC I'm lazy because I don't like to update code in hundreds of places, so the invention is put it in one place. To me WHERE 1=1 breeds the extra work of maintaining the same code in multiple places and reading it in all your generated SQL. I'm lazier than you I think!
    – Jason S
    Commented Feb 23, 2016 at 0:42
23

Indirectly Relevant: when 1=2 is used:

CREATE TABLE New_table_name 
as 
select * 
FROM Old_table_name 
WHERE 1 = 2;

this will create a new table with same schema as old table. (Very handy if you want to load some data for compares)

1
  • 4
    Forgot to add, while it will create a new table with same data as old, the new table wont have other constraints like foreign key from older table
    – milso
    Commented May 8, 2013 at 15:52
21

I found this pattern useful when I'm testing or double checking things on the database, so I can very quickly comment other conditions:

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

turns into:

CREATE VIEW vTest AS
SELECT FROM Table WHERE 1=1 
--AND Table.Field=Value
--AND Table.IsValid=true
17

1 = 1 expression is commonly used in generated sql code. This expression can simplify sql generating code reducing number of conditional statements.

12

Actually, I've seen this sort of thing used in BIRT reports. The query passed to the BIRT runtime is of the form:

select a,b,c from t where a = ?

and the '?' is replaced at runtime by an actual parameter value selected from a drop-down box. The choices in the drop-down are given by:

select distinct a from t
union all
select '*' from sysibm.sysdummy1

so that you get all possible values plus "*". If the user selects "*" from the drop down box (meaning all values of a should be selected), the query has to be modified (by Javascript) before being run.

Since the "?" is a positional parameter and MUST remain there for other things to work, the Javascript modifies the query to be:

select a,b,c from t where ((a = ?) or (1==1))

That basically removes the effect of the where clause while still leaving the positional parameter in place.

I've also seen the AND case used by lazy coders whilst dynamically creating an SQL query.

Say you have to dynamically create a query that starts with select * from t and checks:

  • the name is Bob; and
  • the salary is > $20,000

some people would add the first with a WHERE and subsequent ones with an AND thus:

select * from t where name = 'Bob' and salary > 20000

Lazy programmers (and that's not necessarily a bad trait) wouldn't distinguish between the added conditions, they'd start with select * from t where 1=1 and just add AND clauses after that.

select * from t where 1=1 and name = 'Bob' and salary > 20000
3
  • 1
    "Lazy" I like to think it's smart, not lazy. You're avoiding repetitive code and unnecessary condition checks. Without being able to add where 1=1 (Oracle) or where true (Postgres), I will have to check for each condition whether it is the first one. There is no point in doing so, and it only adds more boilerplate code.
    – ADTC
    Commented Jul 30, 2014 at 5:54
  • 1
    @ADTC, I didn't mean lazy in a bad way. In fact, lazy is a good trait in programming :-) I'll clarify.
    – paxdiablo
    Commented Jul 30, 2014 at 6:28
  • Laziness is the root of all evil
    – user2188550
    Commented Oct 15, 2019 at 20:44
10

where 1=0, This is done to check if the table exists. Don't know why 1=1 is used.

1
  • 1
    Seen this used to return an empty resultset from the database to be used as a holder for new records. Commented Jan 28, 2011 at 20:34
6

While I can see that 1=1 would be useful for generated SQL, a technique I use in PHP is to create an array of clauses and then do

implode (" AND ", $clauses);

thus avoiding the problem of having a leading or trailing AND. Obviously this is only useful if you know that you are going to have at least one clause!

2
  • 1
    That's where the 1=1 comes in. It gives you that "at least one clause" so you don't have to worry about just slapping on an " AND abc"
    – Carl
    Commented Jan 21, 2014 at 5:14
  • I like this idea! See here for more complete example stackoverflow.com/questions/35326160/…
    – drooh
    Commented Feb 10, 2016 at 21:23
6

Here's a closely related example: using a SQL MERGE statement to update the target tabled using all values from the source table where there is no common attribute on which to join on e.g.

MERGE INTO Circles
   USING 
      (
        SELECT pi
         FROM Constants
      ) AS SourceTable
   ON 1 = 1
WHEN MATCHED THEN 
  UPDATE
     SET circumference = 2 * SourceTable.pi * radius;
6

If you came here searching for WHERE 1, note that WHERE 1 and WHERE 1=1 are identical. WHERE 1 is used rarely because some database systems reject it considering WHERE 1 not really being boolean.

0
6

Why would someone use WHERE 1=1 AND <proper conditions>

I've seen homespun frameworks do stuff like this (blush), as this allows lazy parsing practices to be applied to both the WHERE and AND Sql keywords.

For example (I'm using C# as an example here), consider the conditional parsing of the following predicates in a Sql query string builder:

var sqlQuery = "SELECT * FROM FOOS WHERE 1 = 1"
if (shouldFilterForBars)
{
    sqlQuery = sqlQuery + " AND Bars > 3";
}
if (shouldFilterForBaz)
{
    sqlQuery = sqlQuery + " AND Baz < 12";
}

The "benefit" of WHERE 1 = 1 means that no special code is needed:

  • For AND - whether zero, one or both predicates (Bars and Baz's) should be applied, which would determine whether the first AND is required. Since we already have at least one predicate with the 1 = 1, it means AND is always OK.
  • For no predicates at all - In the case where there are ZERO predicates, then the WHERE must be dropped. But again, we can be lazy, because we are again guarantee of at least one predicate.

This is obviously a bad idea and would recommend using an established data access framework or ORM for parsing optional and conditional predicates in this way.

2
  • Or if rolling your own, the where clause builder should be in one place in your code. Then you can handle zero predicates or more than zero predicates in a single location in your code. My suspicion is that the existence of WHERE 1=1 is a fair indicator that that is NOT the case, that the code base is littered with bits of strings WHERE 1=1, which would indicate to me an application architecture problem, and I would guess not the only one!
    – Jason S
    Commented Feb 22, 2016 at 7:02
  • 1
    Actually there's nothing "bad" about the idea, much less an "obvious" fault. Nor is an ORM the proper way at all cases. Learn SQL and Relational Algebra people...
    – Hejazzman
    Commented Oct 10, 2018 at 8:11
3

Having review all the answers i decided to perform some experiment like

SELECT
*
FROM MyTable

WHERE 1=1

Then i checked with other numbers

WHERE 2=2
WHERE 10=10
WHERE 99=99

ect Having done all the checks, the query run town is the same. even without the where clause. I am not a fan of the syntax

0
2

This is useful in a case where you have to use dynamic query in which in where clause you have to append some filter options. Like if you include options 0 for status is inactive, 1 for active. Based from the options, there is only two available options(0 and 1) but if you want to display All records, it is handy to include in where close 1=1. See below sample:

Declare @SearchValue    varchar(8) 
Declare @SQLQuery varchar(max) = '
Select [FirstName]
    ,[LastName]
    ,[MiddleName]
    ,[BirthDate]
,Case
    when [Status] = 0 then ''Inactive''
    when [Status] = 1 then ''Active''
end as [Status]'

Declare @SearchOption nvarchar(100)
If (@SearchValue = 'Active')
Begin
    Set @SearchOption = ' Where a.[Status] = 1'
End

If (@SearchValue = 'Inactive')
Begin
    Set @SearchOption = ' Where a.[Status] = 0'
End

If (@SearchValue = 'All')
Begin
    Set @SearchOption = ' Where 1=1'
End

Set @SQLQuery = @SQLQuery + @SearchOption

Exec(@SQLQuery);
2

Saw this in production code and asked seniors for help.

Their answer:

-We use 1=1 so when we have to add a new condition we can just type

and <condition>

and get on with it.

1

Making "where 1=1" the standard for all your queries also makes it trivially easy to validate the sql by replacing it with where 1 = 0, handy when you have batches of commands/files.

Also makes it trivially easy to find the end of the end of the from/join section of any query. Even queries with sub-queries if properly indented.

0

I first came across this back with ADO and classic asp, the answer i got was: performance. if you do a straight

Select * from tablename

and pass that in as an sql command/text you will get a noticeable performance increase with the

Where 1=1

added, it was a visible difference. something to do with table headers being returned as soon as the first condition is met, or some other craziness, anyway, it did speed things up.

2
  • 3
    If that's true, why doesn't the DBMS always add that?
    – Carcamano
    Commented May 16, 2012 at 11:39
  • I have seen this as well, but sorry I cannot specify the engine / version. It was a at some point in my 20+ years of sql coding. I think what was happening is the that without any Where clause, the execution plan ended up doing a table scan; adding where 1 =1 resulted in a better plan. But the plural of anecdote <> data; i can't swear the underlying issue wasn't a transient network or other resource problem :-p
    – spioter
    Commented Dec 19, 2020 at 14:31
0

Using a predicate like 1=1 is a normal hint sometimes used to force the access plan to use or not use an index scan. The reason why this is used is when you are using a multi-nested joined query with many predicates in the where clause where sometimes even using all of the indexes causes the access plan to read each table - a full table scan. This is just 1 of many hints used by DBAs to trick a dbms into using a more efficient path. Just don't throw one in; you need a dba to analyze the query since it doesn't always work.

1
  • 4
    Do you have any citations that document this behavior for some databases?
    – Joe
    Commented Dec 13, 2013 at 16:16
0

I do this usually when I am building dynamic SQL for a report which has many dropdown values a user can select. Since the user may or may not select the values from each dropdown, we end up getting a hard time figuring out which condition was the first where clause. So we pad up the query with a where 1=1 in the end and add all where clauses after that.

Something like

select column1, column2 from my table where 1=1 {name} {age};

Then we would build the where clause like this and pass it as a parameter value

string name_whereClause= ddlName.SelectedIndex > 0 ? "AND name ='"+ ddlName.SelectedValue+ "'" : "";

As the where clause selection are unknown to us at runtime, so this helps us a great deal in finding whether to include an 'AND' or 'WHERE'.

0

Here is a use case... however I am not too concerned with the technicalities of why I should or not use 1 = 1. I am writing a function, using pyodbc to retrieve some data from SQL Server. I was looking for a way to force a filler after the where keyword in my code. This was a great suggestion indeed:

if _where == '': _where = '1=1'
...
...
...
cur.execute(f'select {predicate} from {table_name} where {_where}')

The reason is because I could not implement the keyword 'where' together inside the _where clause variable. So, I think using any dummy condition that evaluates to true would do as a filler.

Not the answer you're looking for? Browse other questions tagged or ask your own question.