SQL - 同一字段上的多个 Where 条件

Posted

技术标签:

【中文标题】SQL - 同一字段上的多个 Where 条件【英文标题】:SQL - Multiple Where Criteria on same field 【发布时间】: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 【参考方案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 排序

【讨论】:

以上是关于SQL - 同一字段上的多个 Where 条件的主要内容,如果未能解决你的问题,请参考以下文章

sql 对同一字段进行模糊查询时如何将两个条件写入一个like中

SQL中where条件如何判断某个字段有没有

SQL语句where多条件查询怎么写?

SQL server 使用 内联结(INNER JOIN) 联结多个表 (以及过滤条件 WHERE, AND使用区别)

SQL中,如何将三个表中同一字段中的内容汇总到一个字段中?

sql中where 之后怎么加if条件判断