2

我有一长串六位数字(例如 123456)

在我的 postgresql 数据库中,我有一个包含两列 start_value 和 end_value 的表。该表具有起始值和结束值的行,长度为 9 位,代表一个数字范围,即 start_value 可能是 123450000,end_value 可能是 123459999。

我需要将六位数字中的每一个与它在其范围内的 DB 表中的行进行匹配。

对于我列表中的许多数字,我可以简单地运行以下命令

SELECT * FROM table WHERE start_value=(number + 000)

但是,这不包括落在某个范围内但不匹配此模式的数字。

我一直在尝试以下陈述:

SELECT * FROM table WHERE start_value > (number + 000) AND end_value < (number + 999)

但这不起作用,因为某些行覆盖的范围比 xxxxx0000 到 xxxxx9999 更大,因此上面的语句可能返回 20 行或没有。

任何积分都将受到欢迎!

编辑:列的数据类型是数字(25)

4

3 回答 3

7

假设number是数字:

select *
from table
where number * 1000 between start_value and end_value
于 2013-04-19T11:57:36.743 回答
2

好的,所以如果我理解正确,首先您需要将搜索值填充到 9 位。你可以用这个 - 12345 * (10 ^ (9 - length(12345::text)))length(12345::text)获取您当前拥有的位数,然后从 9 中减去该位数,并将您的搜索值乘以 10 的结果的幂。然后,您只需将其放入搜索中即可。结果查询看起来像这样 -

SELECT * FROM table WHERE (12345 * (10 ^ (9 - length(12345::text)))) > start_value AND (12345 * (10 ^ (9 - length(12345::text)))) < end_value

您也可以使用BETWEEN运算符,但它是包容性的,与您拥有的示例查询不匹配。

于 2013-04-19T11:58:01.310 回答
0

PostgreSQL 后

有时我们陷入数据类型转换问题和空值异常。

SELECT *
FROM TABLE
WHERE COALESCE(number::int8, 0::int8) * 1000 BETWEEN start_value::int8 AND end_value::int8
;

number::int8类型转换为整数

start_value::int8类型转换为整数

COALESCE(number::int8, 0::int8) 如果值为空,则返回数字或零以避免异常

于 2020-08-05T06:44:43.180 回答