如何检查浮点数是否在 Postgres 中的多个范围之间?

How to check if a float is between multiple ranges in Postgres?

我正在尝试编写这样的查询:

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 = )) / (SELECT COUNT(DISTINCT cluster_id) FROM cluster) * -1) + 1)

t.ssCUBE 数据类型,<#> 是索引距离运算符。

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

我还找到了 int4rangenumrange,但我认为它们在这里也不起作用,因为距离运算符 returns 是 float8,而不是整数或数字。

您可以使用横向连接:

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 或子查询;我喜欢横向连接,因为它们很容易表达依赖于先前值的多个表达式。