PostgreSQL:按计算值的总和排序

viv*_*vri 6 sql arrays postgresql null

我有一个表tips定义如下:

CREATE TABLE tips
(
  tip_id bigserial NOT NULL,
  tip text NOT NULL,
  author text NOT NULL,
  post_date bigint NOT NULL,
  likers character varying(16)[],
  dislikers character varying(16)[],
  likes integer NOT NULL,
  dislikes integer NOT NULL,
  abuse_history character varying(16)[]
);
Run Code Online (Sandbox Code Playgroud)

我需要根据受欢迎程度获得提示,人气的定义是:
喜欢 - 不喜欢 - (size(abuse_history)*5)

无论排序顺序(ASC/DESC)如何,下面的查询都会给出相同的结果.

select * from tips order by (likes - dislikes - (array_length(abuse_history,1) * 5)) ASC limit 2147483647 offset 0
Run Code Online (Sandbox Code Playgroud)

编辑

我插入了3条有以下数值的记录:
1)1喜欢,0不喜欢,0滥用投诉
2)0赞,1不喜欢,0滥用投诉
3)0赞,0不喜欢,0滥用...

无论排序顺序(ASC/DESC)如何,我都会得到以下顺序:{3,1,2}

有谁能请我指出正确的方向?

Erw*_*ter 7

考虑一下:

SELECT array_length('{}'::character varying(16)[], 1);  -- null
Run Code Online (Sandbox Code Playgroud)

输出是null空数组。而且,你abuse_history可以成为null它自己。所以你需要这样的东西:

SELECT array_length('{}'::character varying(16)[], 1);  -- null
Run Code Online (Sandbox Code Playgroud)

小提琴

示例输出:

SELECT tip_id
     , likes
     , dislikes
     , (likes - dislikes - COALESCE(array_upper(abuse_history,1) * 5,0)) as pop
     , (likes - dislikes - array_upper(abuse_history,1) * 5) AS fail_pop
FROM   tips
ORDER  BY pop DESC;
Run Code Online (Sandbox Code Playgroud)