Postgresql - 两列之间的VALUE

时间:2013-04-19 11:38:17

标签: postgresql range

我有一个很长的六位数字列表(例如123456)

在我的postgresql DB中,我有一个包含两列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)

3 个答案:

答案 0 :(得分:4)

假设number是数字:

select *
from table
where number * 1000 between start_value and end_value

答案 1 :(得分:1)

好的,所以如果我理解正确,首先你需要将你的搜索值填充到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运算符,但它包含在内,与您拥有的示例查询不匹配。

答案 2 :(得分: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) 返回数字;如果值为空,则返回零,以避免出现异常