Instead of using Nested If statements, I was wondering if there is a way to void out parts of a string query if cell value is left blank.
Cell structure is as below:
Cell values from these parameters will get passed into vba code that queries a database. Ideally I don't want to create an individual query for each selection type - and I have it dynamically querying from location already. I want to extend the query to include possible combinations of start, end, value >, value <, while also making it so that if cell value is left blank, then ignore that parameter. So say
SELECT *
from database
WHERE location = 'cell_loc'
AND Value >= 'cell_value'
AND Value <= 'cell_value'
AND Start >= 'cell_date'
AND End <= 'cell_date'
Now imagine that Start is left blank, meaning I want to query from first data point in the database:
I could write a nested if to handle this, but was wondering if there was a way to void out a query parameter so that I could just have a single query fed to database with different parameters changing based off cell data?
Something along the lines of:
SELECT *
from database
WHERE location = 'cell_loc'
AND Value >= 'cell_value'
AND Value <= 'cell_value'
AND Start >= 'cell_date' --> this would be voided out
AND End <= 'cell_date'
Using the coalesce() function you can put an equality condition in your WHERE clause. This is a common SQL trick to deal with null parameters or null values in the data.
SELECT *
from database
WHERE location = 'cell_loc'
AND Value >= 'cell_value'
AND Value <= 'cell_value'
AND (Start >= 'cell_date' OR Start = coalesce('cell date', Start))
AND End <= 'cell_date'
Here's a very basic example:
Sub Tester()
Dim sWhere As String, sql As String
sql = "Select * from myTable "
sWhere = ""
BuildWhere sWhere, "id = <v>", Range("A5")
BuildWhere sWhere, "pName = '<v>'", Range("B5")
BuildWhere sWhere, "pDate > '<v>'", Range("C5")
If Len(sWhere) > 0 Then
sql = sql & " where " & sWhere
Debug.Print sql
'run query
Else
'don't run if no criteria ?
End If
End Sub
'add a where clause only if `c` has a value
Sub BuildWhere(ByRef sWhere As String, test As String, c As Range)
Dim v
v = Trim(c.Value)
If Len(v) > 0 Then
If Len(sWhere) > 0 Then sWhere = sWhere & vbLf & " and "
sWhere = sWhere & Replace(test, "<v>", v)
End If
End Sub
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.