MS Access使用空字段进行多字段搜索

时间:2013-04-07 15:01:54

标签: sql ms-access

我遇到的问题非常类似于 this one ,但我似乎无法解决它!

在MS Access(2003)中,我想根据多个字段中的条目搜索表格,其中一些字段可能为空。

我有:

  • 文字字段
  • 日期字段
  • 整数字段和
  • 备忘录字段(但如果困难的话,我们可能不会费心去搜索这个字段)。

他们准确地映射到一张桌子上。

我正在尝试创建一个查询,当数据输入到这些字段中的一个或多个时,将返回匹配的行,但某些字段可以留空。我该怎么做?

类似链接问题的查询适用于文本字段,但如何处理数字字段,日期字段(甚至可能是备注字段)?

为了给出一个明确的例子,下面的代码块适用于TextField1,但不适用于NumberField1:

PARAMETERS [Forms]![SearchForm]![FilterTextField1] Text ( 255 ), [Forms]![SearchForm]![FilterNumberField1] Text ( 255 );
SELECT Table1.[TextField1], Table1.[NumberField1], Table1.[TextField2], Table1.[TextField3], Table1.[DateField1], Table1.[DateField2], Table1.[DateField3]
FROM Table1
WHERE (Len([Forms]![SearchForm]![FilterTextField1] & '')=0 OR Table1.[TextField1] Like '*' & [Forms]![SearchForm]![FilterTextField1] & '*') AND (Len([Forms]![SearchForm]![FilterNumberField1] & '')=0 OR Table1.[NumberField1] Like '*' & [Forms]![SearchForm]![FilterNumberField1] & '*');

我希望你能提供帮助。我确定我错过了一些非常明显的东西,但由于某些原因,我的大脑感觉它现在正从耳朵里漏出来。

谢谢!


如果您需要,这是相关实体的基本设计:

表1

  • SomePrimaryKeyWeDontCareAboutRightNow
  • 文本字段1
  • 文本字段2
  • 文本字段3
  • NumberField1
  • DateField1
  • DateField2
  • DateField3
  • MemoField1

SearchForm

  • FilterTextField1
  • FilterTextField2
  • FilterTextField3
  • FilterNumberField1
  • FilterDateField1
  • FilterDateField2
  • FilterDateField3
  • FilterMemoField1

2 个答案:

答案 0 :(得分:1)

您可以检查空值或转换为字符串

答案 1 :(得分:0)

你当然可以花费大量时间为此调试一个庞大且非常难以调试的SQL查询,或者只是跳转到VBA并编写一些代码来构建你需要的SQL。

VBA只适用于这些场景,其中某些事情要么不可能,要么变得过于复杂而无法做到。

使用VBA,您可以使用收集所有数据的初始SELECT查询,然后根据搜索表单的内容构建WHERE子句以对其进行过滤。

例如,我有一个这样的表单,允许用户输入任何条件来过滤价格列表:

Filter form sample

实现此功能的一些代码可能如下所示:

' Call this whenever the use click the Apply button '
Private Sub btApply_Click()
    ' Construct the filter '
    Dim filter As String

    If Not IsBlank(cbSupplierID) Then
        If Not IsBlank(filter) Then filter = filter & " AND "
        filter = filter & "(SupplierID=" & cbSupplierID & ")"
    End If

    If Not IsBlank(txtPartNumber) Then
        If Not IsBlank(filter) Then filter = filter & " AND "
        filter = filter & "(PartNumber LIKE '*" & txtPartNumber & "*')"
    End If

    If Not ckShowLocked Then
        If Not IsBlank(filter) Then filter = filter & " AND "
        filter = filter & "(NOT PriceLocked)"
    End If

    ' ... code snipped, you get the jest ... '

    ' Now re-construct the SQL query '
    Dim sql As String
    sql = "SELECT * FROM Price"

    If Not IsBlank(filter) Then
        sql = sql & " WHERE " & filter
    End If

    SubForm.Form.RecordSource = sql
End Sub

它可能看起来像很多代码,但每个块只做一件事,调试和维护比将所有内容都塞进查询要容易得多。