如何忽略 Select 查询中的 00(两个前导零)?

How to ignore 00 (two leading zeros) in Select query?

我不确定是否可行,我有一个数据库 table,它有字段 refNumber,其中一些字段值包含两个前导零,以下是示例。

id. refNumber
10001 123
10002 00456

现在我正在尝试编写一个查询,它可以从这个 table select 中使用我们的无前导零(只有两个不小于或大于两个)。这是一个示例,对于 select refNumber=123 OR refNumber=00123 应该 return 结果 10001,对于 refNumber=00456 OR refNumber=456 应该 return 结果 10002。我不能使用 like 运算符,因为在那种情况下其他记录也可能是 return。是否可以通过查询?如果不是, select 此类记录的正确方法是什么?我避免循环我的应用程序中的所有行。

使用trim()

    Select * from table where trim(refnumber) IN ('123','456')

或 replace() 以支持者为准

 Select * from table where
 replace(refnumber, '0','') IN 
('123','456')

您需要对 - 列和要过滤的值应用 TRIM 函数:

SELECT * FROM MyTable
WHERE TRIM(LEADING '0' FROM refNumber) = TRIM(LEADING '0' FROM '00123') -- here you put your desired ref number

虽然当前接受的答案可行,但请注意,充其量它会导致 Db2 执行完整索引扫描,最坏情况可能导致完整 table 扫描。

对于 return 可能数百万条记录中的 1 条或 2 条记录而言,这不是一种特别有效的方法。只要您在 WHERE 子句中的 table 列上使用表达式,就会发生这种情况。

如果您知道只有 5 位数或更少,更好的解决方案是执行以下操作:

SELECT * FROM MyTable
WHERE refNumber in ('00123','123') 

假设您可以在查询之外构建两种可能性。

如果你真的想让查询处理这两种可能性..

SELECT * FROM MyTable
WHERE refNumber in (LPAD(:value,5,'0'),LTRIM(:value, '0')) 

如果“00123”或“123”作为值传入,上述查询将在 refNumber.

中查找包含“00123”或“123”的记录

并且假设您在 refNumber 上有一个索引,请快速高效地执行此操作。

如果可能有未知数量的前导零,那么您就陷入困境

SELECT * FROM MyTable
WHERE LTRIM(refNumber,'0') = LTRIM(:value, '0')

但是,如果您 platform/version 的 Db2 支持对表达式的索引,您会为了效率而创建一个索引

create index myidx
  on MyTable (LTRIM('0' from refNumber))