我使用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'的字段。请指教。谢谢。
答案 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是一种独特的软件类型,因为它有两个方面:
FRONT-END:一个GUI .exe程序和部分MS Office套件(带有Word / Excel / PowerPoint)仅适用于Windows安装。这个GUI程序可以作为前端&#34;连接到任何符合ODBC / OLEDB的&#34;后端&#34; RDBMS数据库,如SQL Server,Postgres,MySQL,SQLite等。
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程序的地方。
LIKE运营商
上述二分法与LIKE
运算符特别相关:
使用Access的GUI版本,其SQL语言往往是ANSI-plus,并且可以与VBA接口。因此,LIKE
运算符的行为与VBA的LIKE运算符非常相似。此外,LIKE
运算符以ANSI-89模式运行,该模式使用星号*
而非%
通配符LIKE
以及?
和{{1 }}。即便如此,GUI的#
可以使用百分比符号与LIKE
运算符或将数据库设置为ANSI-92 mode(而不是默认的ANSI-89)。
使用Access的后端数据库作为OP,SQL方言使用ANSI-92模式,MS docs显示包括:
ALIKE
:匹配任意数量的字符。它可以用作字符串中的第一个或最后一个字符。
%
:匹配括号内的任何单个字符。
_
:匹配任何单个字母字符。
[]
:匹配一系列字符中的任何一个。您必须按升序指定范围(A到Z,而不是Z到A)。
请注意,与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#