SQL搜索表单



我对SQL非常陌生,因为我从未使用过它!我目前正在Access中编写一个查询,但遇到了一些错误,说查询太复杂,所以我认为直接用SQL编写可能会解决这个问题

我有一个非常简单的数据表,正在创建一个具有多个条件的搜索表单。这些包括搜索名称和街道以及在日期和数字之间搜索,或者比用户输入的日期和数字更大和更低,(当用户从下拉菜单中选择"较低"时,VBA会在第一个"介于"文本框中输入比数据表中的任何日期或数字都低的日期或数字,而用户在第二个文本框中则输入日期或数字。

我正在尝试编写一个我认为会是where子句,在该子句中,查询在窗体的下拉菜单中查找值,如果不匹配,则应用查询的该部分,如果匹配,则跳过该部分。

到目前为止,我所掌握的内容如下,但老实说,我不知道它是否完全正确!

SELECT tblFOIData.Start_Date_of_Liability
FROM tblFOIData
WHERE ((([Forms]![frmSearch]![cmbStartDate_CriteriaSlection]<>"";
(tblFOIData.Start_Date_of_Liability) Between [Forms]![frmSearch]![Between_Start_Date_1] And [Between_Start_Date_2])));

我已经为此工作了几个小时,所以如果这不是最好的方法,有人可以推荐一种更简单的方法来创建一个搜索表单,同时可以输入20个搜索条件。(其中6个是通配符搜索,14个需要在搜索之间),我非常感谢您的建议。

更新:

在看了更多之后,我提出了这个SQL查询:

SELECT *
FROM tblFOIData
WHERE (((tblFOIData.Area_Ref) Is Null Or (tblFOIData.Area_Ref) Like "*" & [Forms]![frmSearch]![cmbBilling_Authority] & "*") 
AND ((Nz([tblFOIData]![Ratepayer],"")) Is Null Or (Nz([tblFOIData]![Ratepayer],"")) Like "*" & [Forms]![frmSearch]![Rate_Payer] & "*") 
AND ((tblFOIData.Scheme_Reference) Is Null Or (tblFOIData.Scheme_Reference) Like "*" & [Forms]![frmSearch]![Scheme_Ref] & "*") 
AND ((tblFOIData.Account_Mailing_Address) Is Null Or (tblFOIData.Account_Mailing_Address) Like "*" & [Forms]![frmSearch]![Account_Mailing] & "*") 
AND ((tblFOIData.Empty_Prop) Is Null Or (tblFOIData.Empty_Prop) Like "*" & [Forms]![frmSearch]![Empt_Prop] & "*") 
AND ((tblFOIData.Charity) Is Null Or (tblFOIData.Charity) Like "*" & [Forms]![frmSearch]![Charity] & "*") 
AND ((tblFOIData.SBRR) Is Null Or (tblFOIData.SBRR) Like "*" & [Forms]![frmSearch]![SBRR] & "*") 
AND ((tblFOIData.Address) Is Null Or (tblFOIData.Address) Like "*" & [Forms]![frmSearch]![Address] & "*") 
AND ((tblFOIData.Postcode) Is Null Or (tblFOIData.Postcode) Like "*" & [Forms]![frmSearch]![Postcode] & "*") 
AND ((tblFOIData.Description) Is Null Or (tblFOIData.Description) Like "*" & [Forms]![frmSearch]![Description] & "*")
AND ((tblFOIData.Start_Date_of_Liability) Is Null Or (tblFOIData.Start_Date_of_Liability) Between [Forms]![frmSearch]![Between_Start_Date_1] And [Forms]![frmSearch]![Between_Start_Date_2]) 
AND ((tblFOIData.[2017_RV]) Is Null Or (tblFOIData.[2017_RV]) Between [Forms]![frmSearch]![Between_2017_RV_1] And [Forms]![frmSearch]![Between_2017_RV_2]) 
AND ((tblFOIData.[2017_Effective_From]) Is Null Or (tblFOIData.[2017_Effective_From]) Between [Forms]![frmSearch]![Between_2017_Effective_1] And [Forms]![frmSearch]![Between_2017_Effective_2]) 
AND ((tblFOIData.[2017_Alteration_Date]) Is Null Or (tblFOIData.[2017_Alteration_Date]) Between [Forms]![frmSearch]![Between_2017_Alteration_1] And [Forms]![frmSearch]![Between_2017_Alteration_2]) 
AND ((tblFOIData.Compiled_2017_RV) Is Null Or (tblFOIData.Compiled_2017_RV) Between [Forms]![frmSearch]![Between_Compiled_RV_1] And [Forms]![frmSearch]![Between_Compiled_RV_2]) 
AND ((tblFOIData.Percentage_Increase) Is Null Or (tblFOIData.Percentage_Increase) Between [Forms]![frmSearch]![Between_Percentage_Increase_1] And [Forms]![frmSearch]![Between_Percentage_Increase_2]) 
AND ((tblFOIData.[2010_Rateable_Value]) Is Null Or (tblFOIData.[2010_Rateable_Value]) Between [Forms]![frmSearch]![Between_2010_RV_1] And [Forms]![frmSearch]![Between_2010_RV_2]) 
AND ((tblFOIData.[2017_UAR_Current]) Is Null Or (tblFOIData.[2017_UAR_Current]) Between [Forms]![frmSearch]![Between_UAR_Current_1] And [Forms]![frmSearch]![Between_UAR_Current_2]) 
AND ((tblFOIData.[2017_UAR_Historic]) Is Null Or (tblFOIData.[2017_UAR_Historic]) Between [Forms]![frmSearch]![Between_UAR_Historic_1] And [Forms]![frmSearch]![Between_UAR_Historic_2])); 

第一部分工作得很好,但当我添加"Between"搜索时,我遇到了一个"太复杂"的错误。

我知道这可能不是执行搜索的最有效方法,但有办法让它发挥作用吗?我在表单上为每个"Between"搜索分配了一个下拉选项,如果他们没有从下拉列表中选择一个选项,可能带有if或case,有没有办法绕过这些标准?

创建复杂的SQL查询的最简单方法是创建一个字符串,该字符串根据表单中的条件而不同,您可以通过多个步骤构建,例如(简化):

Dim strSQL As String
strSQL = "SELECT tblFOIData.Start_Date_of_Liability FROM tblFOIData WHERE"
If (((([Forms]![frmSearch]![cmbStartDate_CriteriaSlection]<>"") Then
strSQL = strSQL + "Start_Date = tblFOIData.Start_Date_of_Liability "
End If
If (otherCriterium = True) Then strSQL = strSQL + "AND myCol = " + [myForm.value] + " "
' etc
strSQL = strSQL + ";"
' now execute the query

创建字符串后,可以将其打印出来进行检查。

这样的查询很快就会变得非常复杂,难以编写和维护。对于搜索表单,我通常会遍历所有控件,并根据结果构建where子句。它干净多了。请参阅我对类似问题的回答:SQL在Where if not null 中包含条件

最新更新