我有一个很长的六位数字列表(例如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)
答案 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)
返回数字;如果值为空,则返回零,以避免出现异常