如何检查浮点数是不是在 Postgres 的多个范围之间?
Posted
技术标签:
【中文标题】如何检查浮点数是不是在 Postgres 的多个范围之间?【英文标题】:How to check if a float is between multiple ranges in Postgres?如何检查浮点数是否在 Postgres 的多个范围之间? 【发布时间】:2019-11-08 03:03:42 【问题描述】:我正在尝试编写这样的查询:
SELECT * FROM table t
WHERE ((long_expression BETWEEN -5 AND -2) OR
(long_expression BETWEEN 0 AND 2) OR
(long_expression BETWEEN 4 and 6))
其中long_expression
大约等于:
(((t.s <#> (SELECT s FROM user WHERE user.user_id = $1)) / (SELECT COUNT(DISTINCT cluster_id) FROM cluster) * -1) + 1)
t.s
和 s
是 CUBE
数据类型,<#>
是索引距离运算符。
我可以在正文中多次重复这个长表达式,但这会非常冗长。另一种方法可能是以某种方式将其保存在变量中(使用 CTE?),但我认为这可能会消除在 WHERE 子句中使用索引的可能性?
我还找到了 int4range
和 numrange
,但我不相信它们也可以在这里工作,因为距离运算符返回 float8,而不是整数或数字。
【问题讨论】:
您可以创建一个包含长表达式的临时表,以及它的索引。 【参考方案1】:您可以使用横向连接:
SELECT t.*
FROM table t CROSS JOIN LATERAL
(VALUES (long_expression)) v(x)
WHERE ((v.x BETWEEN -5 AND -2) OR
(v.x BETWEEN 0 AND 2) OR
(v.x BETWEEN 4 and 6)
);
当然,也可以使用 CTE 或子查询;我喜欢横向连接,因为它们很容易表达依赖于先前值的多个表达式。
【讨论】:
以上是关于如何检查浮点数是不是在 Postgres 的多个范围之间?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Typescript 中检查字符串是不是为数字/浮点数? [复制]
如何在 Typescript 中检查字符串是不是为数字/浮点数? [复制]
如何检查一个值是不是是javascript中的浮点数[重复]