【问题标题】:SQL - Multiple Where Criteria on same fieldSQL - 同一字段上的多个 Where 条件
【发布时间】:2017-09-28 10:30:38
【问题描述】:

我使用 Access MDB 错误日志远程服务设备。使用自定义 Web 浏览器界面,可以再次运行有限的 SQL 查询表 EalInfo。 SQL 字符串必须在一行。

使用下面的代码,我可以选择 ErrNum 包含 S_ 的记录,这很好,因为它排除了许多不需要的记录。

Select 
    DTime,
    ErrNum,
    Param1,
    Param2,
    Controller,
    vxwErrNo,
    Info,
    [TmStamp]/86400 AS DAYS_SinceGantryPwrCycle,
    [TmStamp]/3600 AS HOURS,
    [TmStamp]/60 AS MINs 
from EalInfo 
where ErrNum like '%S_%' 
order by DTime Desc

但是当我添加额外的过滤器(试图排除两个常见但无用的错误)时,不会返回任何记录。

where ErrNum like '%S_%' 
    AND ErrNum <> "S_GAFSTARTUPTASK_DTH_BAD_PARAM" 
    AND ErrNum <> "S_DTH_USER_ALREADY_REGISTERED"

我的 SQL 技能相当薄弱 - 我在 Google 上搜索过并编写了一些脚本 - 但并不快乐。

谢谢

【问题讨论】:

  • 尝试“单引号”而不是“双引号”
  • @RichBenner 。 . . MS Access 对字符串使用双引号。
  • 啊,不知道,谢谢@GordonLinoff

标签: sql ms-access where


【解决方案1】:

在 MS Access 中,like 的通配符是 *,而不是 %。所以,我希望您的查询看起来像这样:

where ErrNum like '*S_*' and
      ErrNum <> "S_GAFSTARTUPTASK_DTH_BAD_PARAM" and
      ErrNum <> "S_DTH_USER_ALREADY_REGISTERED"

我应该注意,所有这些条件都会过滤掉NULL 的值errnum。如果您期待NULL,那么您需要明确检查。

您可能应该将&lt;&gt; 逻辑简化为:

where ErrNum like '*S_*' and
      ErrNum not in ("S_GAFSTARTUPTASK_DTH_BAD_PARAM", "S_DTH_USER_ALREADY_REGISTERED")

【讨论】:

  • 我想回答这个问题,但做了一些挖掘,发现this page,指出它在某些情况下是有效的(当使用 JET 4 或 JET 的 OLE DB 提供程序时)。这可能是原因,但我不知道为什么第一个查询有效。
  • 感谢您的回复 - 我会尝试您的建议并在这里报告。 LIKE 代码有效,很可能正在使用旧版本的 JET / OLE。
【解决方案2】:

多年未使用 Access,所以我可能错了,但请尝试:

  SELECT
        DTime,
        ErrNum,
        Param1,
        Param2,
        Controller,
        vxwErrNo,
        Info,
        [TmStamp]/86400 AS DAYS_SinceGantryPwrCycle,
        [TmStamp]/3600 AS HOURS,
        [TmStamp]/60 AS MINs 

    FROM
        EalInfo 

    WHERE
        ErrNum LIKE '*S_*' 
               AND ErrNum <> 'S_GAFSTARTUPTASK_DTH_BAD_PARAM'
               AND ErrNum <> 'S_DTH_USER_ALREADY_REGISTERED'

    ORDER BY 
        DTime DESC

【讨论】:

    【解决方案3】:

    谢谢所有回答的人。

    这是对我有用的代码。

    此自定义/受限 SQL 接口要求 SQL 字符串全部位于一行 - 但我已尝试在此处对其进行格式化以提高可读性:

    选择

    DTime
    ErrNum
    Param1
    Param2
    Controller
    vxwErrNo
    Info
    [TmStamp]/86400 AS DAYS_SinceGantryPwrCycle
    [TmStamp]/3600 AS HOURS
    [TmStamp]/60 AS MINs 
    

    来自 EalInfo

    在哪里

    (ErrNum like '%S_%') AND 
    (ErrNum not like '%S_GAFSTARTUPTASK%') AND 
    (ErrNum not like '%S_DTH_USER_ALREADY%') 
    

    按 DTime Desc 排序

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-08
      • 2022-01-19
      • 1970-01-01
      • 2014-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多