【问题标题】:Numeric Like Condition - Zero or More Leading Zeros数值类似条件 - 零个或多个前导零
【发布时间】:2014-02-06 16:03:35
【问题描述】:

我正在C# 中编写一个应用程序,我需要根据varchar 字段过滤数据库中的记录,该字段具有由另一个应用程序设置的复合ID (PREFIX#####)

示例表:

RecordId | ObjectId | ...
1        | RFQ00001 | ...
2        | CO00002  | ...
3        | RFQ0101  | ...
4        | R101     | ...
5        | RFQ01    | ...
6        | RFQ101   | ...

我的应用程序(RFQ,CO,R,etc...) 中有一个ObjectId 前缀列表,但正如您所见,它们的长度并不完全相同。数字后缀的前导零数量并不总是相同。

我对我的 LIKE 模式有信心通过前缀 ... WHERE ObjectId LIKE 'RFQ[0-9]%' 进行过滤,但我无法找出模式来查找特定对象。

例如,如果我正在寻找 ID 为 1RFQ 并尝试像 ... WHERE ObjectId LIKE 'RFQ[0-9]%1' 那样从上面的示例表中过滤记录,它将按预期将记录 1 返回为 5,但它也将包括记录 36,因为它们以 '1' 结尾(即使它们用于 ID 为 101 的 RFQ)。

有没有办法在 sql LIKE 模式中使用某种模式来表示 0 个或多个 0,这样我就可以按照 ... WHERE ObjectId LIKE 'RFQ[%0]1' 的方式做一些事情(意思是以 RFQ 开头并以 @987654340 结尾@ 由全 0 分隔或什么都没有)?或者有没有人有更好的想法来处理这个问题?

我无法控制数据如何输入到表中,也无法更改架构。

【问题讨论】:

    标签: c# sql sql-server sql-server-2008 wildcard


    【解决方案1】:

    你可以使用

    WHERE  ObjectId LIKE 'RFQ%1'
           AND ObjectId NOT LIKE 'RFQ%[^0]%1'
    

    [^0] 表示匹配任何不为零的字符。

    【讨论】:

    • 抱歉,我刚刚在示例表中添加了另一条记录,以表明并不总是有前导零。这将错误地包括记录 6,因为没有前导零。
    • @Greg No it doesn't1 匹配 [^0] 所以 NOT LIKE 是假的。
    猜你喜欢
    • 1970-01-01
    • 2022-11-16
    • 2014-02-16
    • 1970-01-01
    • 2015-02-02
    • 2022-11-02
    • 2017-03-17
    • 2012-12-18
    • 1970-01-01
    相关资源
    最近更新 更多