MS Access查询-LIKE x0x6

时间:2017-09-16 13:02:25

标签: sql database ms-access

我使用MS Access作为DB,而字段即时搜索是一个短文本。我想知道如何搜索字段并将其与通配符匹配。例如('x'是通配符) -

x0x6 (matches 1016, 1076.....)
x06x (matches 9067, 3068....)
.
.
.

在线搜索并找到使用此示例 - %? #,但没有一个适合我:/

这是我的SQL查询 -

SELECT COUNT(DPlace) as CounTotal
FROM tblTest2
WHERE DSide=1 AND
      DNumber LIKE '%06%' AND DDate BETWEEN #09-13-16# AND #09-13-17#

SELECT COUNT(DPlace) as CounTotal
FROM tblTest2
WHERE DSide=1 AND
      DNumber LIKE '%0%6' AND DDate BETWEEN #09-13-16# AND #09-13-17#

上面的sql都返回错误的结果,因为它们匹配所有具有'06'的字段。请指教。谢谢。

3 个答案:

答案 0 :(得分:1)

MS Access使用来自其他数据库的不同like模式。这些是well-documented

根据您的描述,您需要:

DNumber LIKE '?06?'

其中?可以是任何字符。

或:

DNumber LIKE '#06#'

其中#特别是数字。

您也可以将后者写成:

DNumber LIKE '[0-9]06[0-9]'

这也适用于SQL Server。

在任何其他数据库中,任何字符的占位符都是_

DNumber LIKE '_06_'

这在MS Access中没有相同的效果。

答案 1 :(得分:1)

以下是对[0-9]工作原因以及?#不在您的LIKE模式中的解释。 TL; DR - 您正在使用运行ANSI-92模式的Access后端。

<强>背景

MS Access是一种独特的软件类型,因为它有两个方面:

  1. FRONT-END:一个GUI .exe程序和部分MS Office套件(带有Word / Excel / PowerPoint)仅适用于Windows安装。这个GUI程序可以作为前端&#34;连接到任何符合ODBC / OLEDB的&#34;后端&#34; RDBMS数据库,如SQL Server,Postgres,MySQL,SQLite等。

  2. BACK-END:默认情况下,Access GUI连接到Windows&#39; JET/ACE SQL Engine(Windows .dll文件),一个文件系统数据存储,随着时间的推移被认为是&#34; Access数据库&#34;但任何 Windows程序或脚本都可以在没有安装MSAccess.exe的情况下连接到它。同样,具有适当ODBC / OLEDB库的任何应用程序层语言(VB,C#,PHP,Python,Java)都可以连接到此后端。实际上,在使用GUI时,VBA默认是连接的!所以Access确实是数据库的GUI控制台(#1定义)。

    OP评论是使用VB6(应用程序代码)连接到JET / ACE引擎作为后端数据库,没有使用GUI程序的地方。

  3. LIKE运营商

    上述二分法与LIKE运算符特别相关:

    1. 使用Access的GUI版本,其SQL语言往往是ANSI-plus,并且可以与VBA接口。因此,LIKE运算符的行为与VBA的LIKE运算符非常相似。此外,LIKE运算符以ANSI-89模式运行,该模式使用星号*而非%通配符LIKE以及?和{{1 }}。即便如此,GUI的#可以使用百分比符号与LIKE运算符或将数据库设置为ANSI-92 mode(而不是默认的ANSI-89)。

    2. 使用Access的后端数据库作为OP,SQL方言使用ANSI-92模式,MS docs显示包括:

        

      ALIKE匹配任意数量的字符。它可以用作字符串中的第一个或最后一个字符。

           

      %匹配括号内的任何单个字符。

           

      _匹配任何单个字母字符。

           

      []匹配一系列字符中的任何一个。您必须按升序指定范围(A到Z,而不是Z到A)。

    3. 请注意,与ANSI-89模式不同,不包括符号-?。但是最后一个符号连字符匹配一系列字符,例如数字#。除非在ANSI-92模式下运行,否则如果在MSAccess.exe内运行,下面的SQL语句将不会返回相同的结果。

      [0-9]

答案 2 :(得分:0)

在Access中,它将是:

SELECT 
    COUNT(*) as CounTotal 
FROM 
    tblTest2 
WHERE 
    DSide=1 AND DNumber LIKE '?0?6' AND DDate BETWEEN #09-13-16# AND #09-13-17#