How to Dynamically Construct SQL Statements

Description

This interactive session demonstrates how you can programmatically modify SQL statements from Xbasic.

sql = "select firstname, lastname, city from customers where lastame = 'smith' order by lastname"
 
dim q as sql::Query
?q.parse(sql)
= .T.
 
?q.SQLStatement
= "SELECT firstname, lastname, city FROM customers  WHERE lastame = 'smith'  ORDER BY lastname"
 
dim si as sql::query::SelectItem
?si.parse( "concatenate(firstname,', ',lastname) as fullname")
= .T.
q.Column.Add(si)
?q.SQLStatement
= "SELECT firstname, lastname, city,  concatenate(firstname, ', ', lastname)  AS fullname FROM customers  WHERE lastame = 'smith'  ORDER BY lastname"
 
 
dim le as sql::query::LogicalExpression
'remove the where clause by setting to a blank logical expression
q.Where = le
?q.SQLStatement
= "SELECT firstname, lastname, city,  concatenate(firstname, ', ', lastname)  AS fullname FROM customers   ORDER BY lastname"
 
'add a new where clause
?le.parse("lastname = 'smith' and firstname = 'john'")
= .T.
q.Where = le 
?q.SQLStatement
= "SELECT firstname, lastname, city,  concatenate(firstname, ', ', lastname)  AS fullname FROM customers  WHERE lastname = 'smith'  AND  firstname = 'john'  ORDER BY lastname"
 
'remove all columns from the sql
?q.Column.Count
= 4
'execute the remove 4 times
q.Column.Remove(1)
q.Column.Remove(1)
q.Column.Remove(1)
q.Column.Remove(1)
?q.SQLStatement
= "SELECT  FROM customers  WHERE lastname = 'smith'  AND  firstname = 'john'  ORDER BY lastname"
 
si.parse("firstname")
'now add back 1 column
q.Column.Add(si)
?q.SQLStatement
= "SELECT firstname FROM customers  WHERE lastname = 'smith'  AND  firstname = 'john'  ORDER BY lastname"
 
'count the number of levels in the order by
?q.NestedOrderBy.Count
= 1
 
'remove the order by clause
q.NestedOrderBy.Reset()
?q.SQLStatement
= "SELECT firstname FROM customers  WHERE lastname = 'smith'  AND  firstname = 'john'"
 
'add in a new order by clause
Dim co as SQL::Query::ColumnOrder
?co.parse("city DESC")
= .T.
 
q.NestedOrderBy.Add(co)
 
?q.SQLStatement
= "SELECT firstname FROM customers  WHERE lastname = 'smith'  AND  firstname = 'john'  ORDER BY city DESC"
 
'now add in another order by clause
co.parse("lastname")
q.NestedOrderBy.add(co)
?q.SQLStatement
= "SELECT firstname FROM customers  WHERE lastname = 'smith'  AND  firstname = 'john'  ORDER BY city DESC, lastname"