Access 2007使用特殊字符解析分隔符

时间:2013-07-22 22:43:47

标签: sql ms-access

我有一个数据字段,它使用@符号将一个数据值指定给更广泛的数据集。它类似但不等同于电子邮件“john@example.com”。第一个@左边的信息是我想要的,但我似乎无法让Instr()函数返回@的正确索引。当我为Instr(1,[DataSet],"[@]")创建一列时,我得到一个满0的列。请务必注意,我正在寻址的列中的所有数据都带有@符号。

我已经读过访问权限不能很好地处理特殊字符,但我对我的问题的解决方法感到茫然。我把引号中的特殊字符括起来,但它似乎没有什么区别。作为参考,要解析的几个示例值是:

MSE3.7 305ST 305@2000 275@3000 notes and things here
MGT5.0 505ST 2013 505@1800 450@2600 other notes w/comments

正如你所知道的,除了'at sign'之外没有常量可以分隔(这些不同的值中有大约400个),如果我无法使查询工作,这是我的问题的根源原样。

期待听到过去的经验/解决方法。

编辑: 我的完整查询如下:

SELECT First([QRY_ENGINES_2012-YTD].EngineOptionCd) AS [EngineOptionCd Field], Count([QRY_ENGINES_2012-YTD].EngineOptionCd) AS NumberOfDups, Option.OptionDes, InStr(1,[EngineOptionCd],"[@]") AS [Engine Horsepower] INTO [TBL_2012-13YTD_ENGINES]
FROM [QRY_ENGINES_2012-YTD] INNER JOIN Option ON [QRY_ENGINES_2012-YTD].EngineOptionCd = Option.OptionCd
GROUP BY Option.OptionDes, [QRY_ENGINES_2012-YTD].EngineOptionCd, InStr(1,[EngineOptionCd],"[@]")
HAVING (((Count([QRY_ENGINES_2012-YTD].EngineOptionCd))>1) 
    AND ((OptionDes) Like "*" & "MST" & "*" And (OptionDes) Not Like "*" & "MST12" & "*" And (OptionDes) Not Like "*" & "11.9" & "*")) OR (((OptionDes) Like "*" & "GT" & "*"));

我编辑了一些名字以提供匿名。它起初是一个“查找重复”查询,但我想解析一些包含的信息。也许这就是问题?需要创建单独的查询吗?

编辑:问题是我在代码中引用了错误的字段。

2 个答案:

答案 0 :(得分:0)

弃掉@第三个参数中InStr符号周围的方括号。

从立即窗口考虑此示例。前两个示例在第一个字符串中查找字符串“[@]”的位置。

? InStr(1, "john@example.com", "[@]")
 0 
? InStr(1, "john[@]example.com", "[@]")
 5 
? InStr(1, "john@example.com", "@")
 5 

答案 1 :(得分:0)

选项是保留字。逃避它

SELECT First([QRY_ENGINES_2012-YTD].EngineOptionCd) AS [EngineOptionCd Field]
, Count([QRY_ENGINES_2012-YTD].EngineOptionCd) AS NumberOfDups
, [Option].OptionDes
, InStr(1,[EngineOptionCd],"@") AS [Engine Horsepower] 
INTO [TBL_2012-13YTD_ENGINES]
FROM [QRY_ENGINES_2012-YTD] 
INNER JOIN [Option] ON [QRY_ENGINES_2012-YTD].EngineOptionCd = [Option].OptionCd
GROUP BY [Option].OptionDes, [QRY_ENGINES_2012-YTD].EngineOptionCd, InStr(1,[EngineOptionCd],"@")
HAVING (((Count([QRY_ENGINES_2012-YTD].EngineOptionCd))>1) 
    AND ((OptionDes) Like "*" & "MST" & "*" 
    And (OptionDes) Not Like "*" & "MST12" & "*" 
    And (OptionDes) Not Like "*" & "11.9" & "*"))

    OR (((OptionDes) Like "*" & "GT" & "*"));