Access查询中区分大小写的GROUP BY

时间:2014-05-15 14:01:29

标签: ms-access ms-access-2010

我是Access的新手,但我们的任务是开发一个查询,通过ODBC连接从我们现有的工单表中提取数据。我遇到的问题是某些货件有多个货物需要根据其ID进行分组。但是ID区分大小写(例如00000A和00000a不同)。我如何将这些条目分组,并将ID保存为区分大小写?我尝试使用在线发现的许多SQL命令,但是它们总是会导致错误,这是因为数据库没有托管在服务器上吗?

我试过了 -

SELECT wofile.id collate SQL_Latin1_General_CP1_CS_AS, First(wofile.wo_number) 
AS FirstOfwo_number, First(wofile.cust_name) AS FirstOfcust_name, 
First(woload.ship_act_date) AS FirstOfship_act_date, Last(woload.cons_act_date) 
AS LastOfcons_act_date FROM wofile INNER JOIN woload ON wofile.id = woload.wo_id 
WHERE (((StrComp([wofile].[id],[woload].[wo_id],0))=0)) 
GROUP BY wofile.id collate SQL_Latin1_General_CP1_CS_AS

SELECT wofile.id, First(wofile.wo_number) 
AS FirstOfwo_number, First(wofile.cust_name) AS FirstOfcust_name, 
First(woload.ship_act_date) AS FirstOfship_act_date, Last(woload.cons_act_date) 
AS LastOfcons_act_date FROM wofile INNER JOIN woload ON wofile.id = woload.wo_id 
WHERE (((StrComp([wofile].[id],[woload].[wo_id],0))=0)) 
GROUP BY wofile.id Cast(wofile.id As varbinary(100))

SELECT wofile.id, First(wofile.wo_number) 
AS FirstOfwo_number, First(wofile.cust_name) AS FirstOfcust_name, 
First(woload.ship_act_date) AS FirstOfship_act_date, Last(woload.cons_act_date) 
AS LastOfcons_act_date FROM wofile INNER JOIN woload ON wofile.id = woload.wo_id 
WHERE (((StrComp([wofile].[id],[woload].[wo_id],0))=0)) 
GROUP BY BINARY wofile.id

1 个答案:

答案 0 :(得分:0)

如Microsoft支持文章here中所述:

  

Microsoft Jet数据库引擎本质上不区分大小写。连接表时,它将小写的“abc”与大写的“ABC”匹配,这在大多数情况下是可取的。

(对于较新的“Access数据库引擎”,a.k.a。“ACE”也是如此,它由Access 2010使用。)

本文接着描述了几种执行区分大小写的JOIN的策略。其中,最有可能为你工作的那个(你需要你的JOIN和你的GROUP BY子句区分大小写)是他们称之为“十六进制扩展”的那个,你在每个表中创建另一个列,存储ID值的十六进制表示。他们建议的功能是......

Public Function StrToHex(X As Variant) As Variant
Dim I As Long, Temp As String
    If IsNull(X) Then Exit Function
    Temp = Space$(Len(X) * 2)
    For I = 1 To Len(X)
        Mid$(Temp, I * 2 - 1, 2) = Right$("0" & Hex$(Asc(Mid$(X, I, 1))), 2)
    Next I
    StrToHex = Temp
End Function

...如果您的ID字符串不包含Unicode字符,它将起作用。该函数将字符串转换为每个字符的十六进制表示,例如

StrToHex("GORD") --> "474F5244"
StrToHex("gord") --> "676F7264"

一旦您使用相应的十六进制值填充了新的“代理ID”字段,就可以在JOIN和GROUP BY子句中使用这些字段。

有关详细信息,请参阅上述支持文章:

How To Perform a Case-Sensitive JOIN Through Microsoft Jet