Click here to Skip to main content
13,346,895 members (40,400 online)
Click here to Skip to main content
Add your own
alternative version


33 bookmarked
Posted 18 Feb 2002

SQL WHERE - the easy way

Rate this:
Please Sign up or sign in to vote.
Creating SQL WHERE clauses can be a pain. This class grants relief.
<!-- Download Links -->

Creating SQL WHERE clauses

When developing C++ code to query SQL databases, one ends up with code which contains lots of ugly and cluttering statements like this:

char buf[256]; 
sprintf(buf, "WHERE (article=%i) AND (subject='%s%')", nArticle, pstrSubject); 
strcat(sql, buf);
// or even worse
strcat(sql, " WHERE (article=");
strcat(sql, _itoa(nArticle, buf, 10));
strcat(sql, ") AND (subject='");
strcat(sql, pstrSubject);
strcat(sql, ")");
// and so on and so forth...

Most of you have seen that sort of thing. I created the CWhere class to simplify creation of WHERE clauses and cleanup code. The resulting code, using the CWhere class, looks like this:

CWhere w(_T("article"), 1234); 
w.Add(_T("subject"), _T("CodeProject"); 
mySQLstring += w.GetWhereClause(); 
// should read "WHERE (article = 1234) AND (subject = 'CodeProject') ";

The class implements various methods to create the final string. Basically it all ends in providing several conversions of various datatypes to strings.
Currently the class contains all functions needed to create the following kind of clauses:

  1. "fieldXY IS NULL"
  2. "fieldXY exp value" where exp is any valid SQL operator (<, >, =,...)
  3. "fieldXY BETWEEN value1 AND value2"

Also, these clauses can be cascaded with AND and OR statements. The class takes care of nice SQL formatting, paranthesis, brackets and spaces. You can immediately use the resulting string for concatenation or other string operations. It contains leading and trailing spaces and all expressions are enclosed in brackets.

The class will provide correct strings for Unicode SQL statements too when the application is compiled using the UNICODE define.

Using the class

Lets start with the most common usage: creating a instance of CWhere with the first expression supplied in the constructor:

CWhere w(_T("article"), 1234);

This will create the variable w already containing "WHERE (article = 1234)". Now lets add another field:

w.Add(_T("subject"), _T("CodeProject");

This will add a " AND (subject = 'CodeProject')" to the variable. Finally, use the WHERE clause and add it to an existing SQL statement created somewhere else:

mySQLstring += w.GetWhereClause(); 
// should contain " WHERE (article = 1234) AND (subject = 'CodeProject') "

If the presence of the keyword WHERE is not needed or not wanted, just use GetWhereClausePlain().

Logical operations AND, OR

To simplify the creation of complex clauses containing AND or OR combinations, the operators &, |, &= and |= are overloaded. You can use them in a very intuitive way to create logical operations with the CWhere class.

CWhere w, article1, article2("article", -1L), subject("subject", pstrSubject), priority("priority", 2);
// logical operation OR
w = article1 | article2;		
// logical operation AND
w &= subject & priority;		

The resulting WHERE clause is: " WHERE ((article IS NULL) OR (article = -1)) AND ((subject = 'CodeProject') AND (priority = 2))"


Tested under Windows XP Pro, with VC6 and MFC. Supports fully UNICODE or MBCS. STL version is up to the reader :-)


This article, along with any associated source code and files, is licensed under The Microsoft Public License (Ms-PL)


About the Author

No Biography provided

You may also be interested in...


Comments and Discussions

Questionstd::stringstream ?? Pin
Brett Gmoser19-Apr-07 13:34
memberBrett Gmoser19-Apr-07 13:34 
QuestionLatest Code ??? Pin
bachi19-Feb-04 5:08
memberbachi19-Feb-04 5:08 
AnswerRe: Latest Code ??? Pin
SaurweinAndreas19-Feb-04 5:17
memberSaurweinAndreas19-Feb-04 5:17 
Generalsmall help Pin
bachi19-Feb-04 7:13
memberbachi19-Feb-04 7:13 
Generalhandling differences in sql Pin
Vachooho18-Aug-03 15:12
sussVachooho18-Aug-03 15:12 
GeneralRe: handling differences in sql Pin
SaurweinAndreas21-Aug-03 4:17
memberSaurweinAndreas21-Aug-03 4:17 
QuestionCwhere 2.0 ? Pin
Jonathan de Halleux23-Jul-03 13:24
memberJonathan de Halleux23-Jul-03 13:24 
GeneralGoing further Pin
Jonathan de Halleux12-Jul-03 8:13
memberJonathan de Halleux12-Jul-03 8:13 
GeneralRe: Going further Pin
SaurweinAndreas16-Jul-03 4:45
memberSaurweinAndreas16-Jul-03 4:45 
Generalsource coming Pin
Jonathan de Halleux16-Jul-03 5:37
memberJonathan de Halleux16-Jul-03 5:37 
GeneralRe: source coming Pin
SaurweinAndreas17-Jul-03 6:10
memberSaurweinAndreas17-Jul-03 6:10 
Generalpreview Pin
Jonathan de Halleux18-Jul-03 8:59
memberJonathan de Halleux18-Jul-03 8:59 
GeneralRe: preview Pin
SaurweinAndreas18-Jul-03 11:19
memberSaurweinAndreas18-Jul-03 11:19 
GeneralRe: preview Pin
Jonathan de Halleux18-Jul-03 18:26
memberJonathan de Halleux18-Jul-03 18:26 
Generaluseful class Pin
Anthony_Yio2-Jan-03 16:10
memberAnthony_Yio2-Jan-03 16:10 
GeneralA suggestion Pin
Jim Johnson19-Feb-02 23:20
memberJim Johnson19-Feb-02 23:20 
GeneralDuplicate... Pin
Jim Johnson20-Feb-02 0:56
memberJim Johnson20-Feb-02 0:56 
GeneralRe: Duplicate... Pin
Andreas Saurwein20-Feb-02 7:18
memberAndreas Saurwein20-Feb-02 7:18 
GeneralThanks, Pin
Brian V Shifrin19-Feb-02 21:22
memberBrian V Shifrin19-Feb-02 21:22 
GeneralRe: Thanks, Pin
Andreas Saurwein20-Feb-02 7:17
memberAndreas Saurwein20-Feb-02 7:17 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Terms of Use | Mobile
Web01 | 2.8.180111.1 | Last Updated 19 Feb 2002
Article Copyright 2002 by Andreas S. Franci Gonçalves
Everything else Copyright © CodeProject, 1999-2018
Layout: fixed | fluid