如何检查浮点数是不是在 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.ssCUBE 数据类型,&lt;#&gt; 是索引距离运算符。

我可以在正文中多次重复这个长表达式,但这会非常冗长。另一种方法可能是以某种方式将其保存在变量中(使用 CTE?),但我认为这可能会消除在 WHERE 子句中使用索引的可能性?

我还找到了 int4rangenumrange,但我不相信它们也可以在这里工作,因为距离运算符返回 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中的浮点数[重复]

Python如何检查列表中的项目是不是为浮点数,如果是,将其更改为字符串? [复制]

检查字符串是不是可以在 Python 中转换为浮点数

检查浮点数是不是可以无损失地转换为整数