如何从多个可能为空的搜索框中查询一个字段

时间:2014-03-26 20:03:00

标签: sql vba ms-access

我有一个名为" Expertise"其中包含有关医生/护士/外科医生的数据,以便Doctor1可能拥有"小儿外科医生;神经病学"在这个领域里。基本上只是关于博士的一堆信息将填补这个领域。我在表单上有四个搜索框,用户可以搜索特定的医疗保健专业人员。有人可能想要搜索"儿科","外科医生"和"神经病学"。我现在使用SQL进行此设置,我的代码如下所示:

AND (dbo_Contact.Expertise) Like "*" & [Forms]![Data_Qry_Test_Page]![Expertise1] & "*" 
AND (dbo_Contact.Expertise) Like "*" & [Forms]![Data_Qry_Test_Page]![Expertise2] & "*" 
AND (dbo_Contact.Expertise) Like "*" & [Forms]![Data_Qry_Test_Page]![Expertise3] & "*" 
AND (dbo_Contact.Expertise) Like "*" & [Forms]![Data_Qry_Test_Page]![Expertise4] & "*"

注意我是如何使用Like的,因为用户可能想要查找单词" Surg"这将返回包含手术和外科医生的记录。如果记录在其专业领域中具有儿科,外科医生和神经病学的话,这将非常有用。但是我需要这个查询来返回在他的专业领域只有外科医生的Doctor1和在他的专业领域中有神经病学的Doctor2。

如果我使用OR代替AND,它将返回数据库中的所有记录。我相信我必须使用Nz()函数,但我不确定如何。

2 个答案:

答案 0 :(得分:1)

我认为你的问题只是在布尔逻辑的组织中。

您的查询现在的工作方式,只有在所有4个字段中都存在dbo_Contact.Expertise时才会得到结果。

你想要的是,如果{1}存在于field1或field2或field3或field4中。

您目前获取整个数据库的原因是因为您在此组中有一些标准,而您未在此处包含这些标准。它的说法"以上所有这些东西"或者"用专业知识检查这个"

相反,您需要将其作为一个组包含在上面的其他组中。

Expertise

注意我是如何将所有约束放在parens和#34; anded"它们与先前的约束一起。

答案 1 :(得分:1)

您可以使用Nz将空文本框值转换为字符串,该字符串永远不会匹配dbo_Contact.Expertise中存储的任何值。例如,说“BOGUS”永远不会匹配。然后Like '*BOGUS*'也永远不会匹配。

因此,您可以OR这些Nz条件。任何非空文本框都将选择匹配的行。空文本框不会选择任何文本框。 (并且查询结果集是由每个条件选择的行的组合。)

SELECT c.*
FROM dbo_Contact AS c
WHERE
   c.Expertise Like '*' & Nz(Forms!Data_Qry_Test_Page!Expertise1, 'BOGUS') & '*' 
OR c.Expertise Like '*' & Nz(Forms!Data_Qry_Test_Page!Expertise2, 'BOGUS') & '*' 
OR c.Expertise Like '*' & Nz(Forms!Data_Qry_Test_Page!Expertise3, 'BOGUS') & '*' 
OR c.Expertise Like '*' & Nz(Forms!Data_Qry_Test_Page!Expertise4, 'BOGUS') & '*'