SQL - 同一字段上的多个Where Criteria

时间:2017-09-28 10:30:38

标签: sql ms-access where

我使用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技能非常弱 - 我用谷歌搜索并编写了一些小猫 - 但没有快乐。

由于

3 个答案:

答案 0 :(得分:1)

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

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

我应该注意,所有这些条件都会滤除NULL的{​​{1}}值。如果您期望errnum,则需要明确检查。

您应该将NULL逻辑简化为:

<>

答案 1 :(得分:0)

未使用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

答案 2 :(得分:0)

谢谢给所有回答的人。

这是适用于我的代码。

这个自定义/有限的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的订单