db2 如何在选择查询中忽略00(两个前导零)?

ukxgm1gy  于 2022-11-07  发布在  DB2
关注(0)|答案(3)|浏览(254)

我不确定这是否可能,我有一个DB表,其中有字段refNumber,一些字段值包含两个前导零,以下是示例。
| 同上。|参考编号|
| - -|- -|
| 小千零一|一百二十三|
| 小行星1000|小行星00456|
现在,我尝试编写一个查询,该查询可以从此表中进行选择,并且没有前导零(仅限两个不小于或大于两个)。以下是一个示例,对于选择参考编号=123或参考编号=00123,应返回结果10001;对于参考编号=00456或参考编号=456,应返回结果10002。我不能使用Like运算符,因为在这种情况下,可能还会返回其他记录。是否可以通过查询来实现?如果不能,选择此类记录的正确方法是什么?我正在避免在应用程序中循环所有行。

kyks70gy

kyks70gy1#

您需要对-列和要作为筛选依据的值应用TRIM函数:

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

zysjyyx42#

使用修剪()

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

或替换(),以支持的为准

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

dvtswwa33#

虽然当前接受的答案是可行的,但请注意,最好的情况下,它会导致Db2执行全索引扫描,最坏的情况下,它会导致全表扫描。
要从数百万条记录中返回1条或2条记录,这不是一种特别有效的方法。每当在WHERE子句中对表列使用表达式时,都会发生这种情况。
如果你知道只有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')

但是,如果您的平台/版本的Db2支持表达式上的索引,则出于效率考虑,您需要创建一个索引

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

相关问题