SQL WHERE BETWEEN 未选择所有数据
SQL WHERE BETWEEN not selecting all data
我在一个范围内工作的应用程序中编写了导出(访问 Excel)函数。
用户有 4 个 RadioButtons
:A-F、G-M、N-R 和 S-Z。
假设用户选择了 rbtnAF
,这会将所有客户加载到 Customer_Code
字段以 A、B、C、D、E 或 F 开头的网格中。
加载数据的代码如下:
Dim strFields As String = "[Customer_Addresses].[Cust_Code], [Customers].[Customer_Name], [Customer_Addresses].[Contact_Code], [Customer_Addresses].[Contact_Name], " & _
"[Customer_Addresses].[Contact_Type], [Customer_Addresses].[Add1], [Customer_Addresses].[Add2], [Customer_Addresses].[Add3], [Customer_Addresses].[Add4], " & _
"[Customer_Addresses].[Add5], [Customer_Addresses].[Postcode], [Customer_Addresses].[Country], [Customer_Addresses].[Telephone], [Customer_Addresses].[Fax], " & _
"[Customer_Addresses].[Email], [Customer_Addresses].[Mobile_Phone], [Customers].[Customer_Category], [Customers].[Average_Payment_Terms], " & _
"[Customers].[Notes], [Customers].[salesRep], [Customers].[hoEmail], [Customers].[webpage] FROM Customers " & _
"INNER JOIN Customer_Addresses ON [Customers].[Customer_Code] =[Customer_Addresses].[Cust_Code]"
If rbtnAF.Checked = True Then
sql = "SELECT " & strFields & " WHERE [Customer_Addresses].[Cust_Code] BETWEEN " & _
"'A*' AND 'F*' ORDER BY [Customer_Addresses].[Cust_Code]"
Dim da As New OleDbDataAdapter(sql, con)
Dim ds As New DataSet
Dim dt As New System.Data.DataTable
da.Fill(ds)
dt = ds.Tables(0).Copy()
ugExport.DataSource = Nothing
ugExport.DataSource = dt
我认为这工作正常,我能够将正确的范围加载到网格中并根据需要导出它们。
但是,该用户已回复我并表示它并未载入所有客户。
我觉得这有点奇怪,所以我加载了他们的数据库并为自己进行了测试。在数据库中,有 4 个客户符合 A-F 范围,如图所示。
但是,当我再查看导出列表中的客户范围A-F时,只显示了2个客户。
还值得注意的是,在客户列表屏幕中有一个 TextBox
允许用户按客户代码搜索 - 当我只输入一个 F 时,所有 4 个客户都会按预期显示。
尽管有 4 条记录符合条件,但究竟是什么原因导致导出列表中只显示 2 条结果?
检查 between 语法,您会发现它将 * 视为文字字符,请参见此处 https://support.office.com/en-us/article/Between-And-Operator-a435878d-63f7-4825-8c31-999432ae8223
您可以使用
Like "[A-F]*"
相反。
我在一个范围内工作的应用程序中编写了导出(访问 Excel)函数。
用户有 4 个 RadioButtons
:A-F、G-M、N-R 和 S-Z。
假设用户选择了 rbtnAF
,这会将所有客户加载到 Customer_Code
字段以 A、B、C、D、E 或 F 开头的网格中。
加载数据的代码如下:
Dim strFields As String = "[Customer_Addresses].[Cust_Code], [Customers].[Customer_Name], [Customer_Addresses].[Contact_Code], [Customer_Addresses].[Contact_Name], " & _
"[Customer_Addresses].[Contact_Type], [Customer_Addresses].[Add1], [Customer_Addresses].[Add2], [Customer_Addresses].[Add3], [Customer_Addresses].[Add4], " & _
"[Customer_Addresses].[Add5], [Customer_Addresses].[Postcode], [Customer_Addresses].[Country], [Customer_Addresses].[Telephone], [Customer_Addresses].[Fax], " & _
"[Customer_Addresses].[Email], [Customer_Addresses].[Mobile_Phone], [Customers].[Customer_Category], [Customers].[Average_Payment_Terms], " & _
"[Customers].[Notes], [Customers].[salesRep], [Customers].[hoEmail], [Customers].[webpage] FROM Customers " & _
"INNER JOIN Customer_Addresses ON [Customers].[Customer_Code] =[Customer_Addresses].[Cust_Code]"
If rbtnAF.Checked = True Then
sql = "SELECT " & strFields & " WHERE [Customer_Addresses].[Cust_Code] BETWEEN " & _
"'A*' AND 'F*' ORDER BY [Customer_Addresses].[Cust_Code]"
Dim da As New OleDbDataAdapter(sql, con)
Dim ds As New DataSet
Dim dt As New System.Data.DataTable
da.Fill(ds)
dt = ds.Tables(0).Copy()
ugExport.DataSource = Nothing
ugExport.DataSource = dt
我认为这工作正常,我能够将正确的范围加载到网格中并根据需要导出它们。 但是,该用户已回复我并表示它并未载入所有客户。
我觉得这有点奇怪,所以我加载了他们的数据库并为自己进行了测试。在数据库中,有 4 个客户符合 A-F 范围,如图所示。
但是,当我再查看导出列表中的客户范围A-F时,只显示了2个客户。
还值得注意的是,在客户列表屏幕中有一个 TextBox
允许用户按客户代码搜索 - 当我只输入一个 F 时,所有 4 个客户都会按预期显示。
尽管有 4 条记录符合条件,但究竟是什么原因导致导出列表中只显示 2 条结果?
检查 between 语法,您会发现它将 * 视为文字字符,请参见此处 https://support.office.com/en-us/article/Between-And-Operator-a435878d-63f7-4825-8c31-999432ae8223
您可以使用
Like "[A-F]*"
相反。