如何忽略 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))
我不确定是否可行,我有一个数据库 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
.
并且假设您在 refNumber 上有一个索引,请快速高效地执行此操作。
如果可能有未知数量的前导零,那么您就陷入困境
SELECT * FROM MyTable
WHERE LTRIM(refNumber,'0') = LTRIM(:value, '0')
但是,如果您 platform/version 的 Db2 支持对表达式的索引,您会为了效率而创建一个索引
create index myidx
on MyTable (LTRIM('0' from refNumber))