如何检查浮点数是否在 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.s
和 s
是 CUBE
数据类型,<#>
是索引距离运算符。
我可以在正文中多次重复这个长表达,但这会非常冗长。另一种方法可能是以某种方式将其保存在变量中(使用 CTE?),但我认为这可能会消除在 WHERE 子句中使用索引的可能性?
我还找到了 int4range
和 numrange
,但我认为它们在这里也不起作用,因为距离运算符 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 或子查询;我喜欢横向连接,因为它们很容易表达依赖于先前值的多个表达式。
我正在尝试编写这样的查询:
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.s
和 s
是 CUBE
数据类型,<#>
是索引距离运算符。
我可以在正文中多次重复这个长表达,但这会非常冗长。另一种方法可能是以某种方式将其保存在变量中(使用 CTE?),但我认为这可能会消除在 WHERE 子句中使用索引的可能性?
我还找到了 int4range
和 numrange
,但我认为它们在这里也不起作用,因为距离运算符 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 或子查询;我喜欢横向连接,因为它们很容易表达依赖于先前值的多个表达式。