我正在尝试编写这样的查询:
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的值,而不是整数或数字。
您可以使用横向连接: