【问题标题】:MS Access Query -LIKE x0x6MS 访问查询 -LIKE x0x6
【发布时间】:2017-09-16 13:02:24
【问题描述】:

我使用 MS Access 作为数据库,并且我正在搜索的字段是短文本。想知道如何搜索字段并将其与通配符匹配。例如('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' 的字段。请指教。谢谢。

【问题讨论】:

    标签: sql database ms-access


    【解决方案1】:

    这里解释了为什么[0-9] 有效而?# 在您的LIKE 模式中无效。 TL;DR - 您正在使用运行 ANSI-92 模式的 Access 后端。

    背景

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

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

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

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

    LIKE 运算符

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

    1. 使用 GUI 版本的 Access,其 SQL 方言倾向于 ANSI-plus,并且可以与 VBA 交互。因此,LIKE 运算符的行为与 VBA 的 LIKE 运算符非常相似。此外,LIKE 运算符在 ANSI-89 模式下运行,该模式使用星号 * 而不是 % 通配符作为 LIKE 以及 ?#。即便如此,GUI 的 LIKE 可以将百分比符号与 ALIKE 运算符一起使用,或者将数据库设置为 ANSI-92 mode(而不是默认的 ANSI-89)。

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

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

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

      []: 匹配任何单个字母字符。

      -: 匹配任意一个字符范围。您必须按升序指定范围(A 到 Z,而不是 Z 到 A)。

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

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

    【讨论】:

    • 感谢您的详细解释。我现在正在使用'_',它工作得很好。但是 '[]' 在我的情况下似乎不起作用。谢谢:)
    【解决方案2】:

    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 中没有相同的效果。

    【讨论】:

    • 两者都 # ?不工作,但幸运的是 [0-9] 工作 :) 谢谢!
    • 嗯。 . .我想知道您是否正在使用 MS Access 前端来连接 SQL Server 数据库。
    • 我不确定这意味着什么。我使用 VB6 连接到 MS Access DB。你知道其他方法可以做到这一点吗?因为使用 [] 有效,但是如果有很多字母数字,特殊的 chr,它会很麻烦。这会有效吗[%]06[%]?
    【解决方案3】:

    在 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#
    

    【讨论】:

    • 两者都 # ?不工作,但幸运的是 [0-9] 工作 :) 谢谢!
    猜你喜欢
    • 1970-01-01
    • 2019-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-12
    • 2012-05-07
    • 1970-01-01
    相关资源
    最近更新 更多