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}
有谁能请我指出正确的方向?
考虑一下:
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)