PostgreSQL:按计算值的总和排序
发布时间:2020-12-13 16:09:27 所属栏目:百科 来源:网络整理
导读:我有一个表提示,定义如下: 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 intege
我有一个表提示,定义如下:
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)[] ); 我需要根据受欢迎程度获得提示,人气的定义是: 无论排序顺序(ASC / DESC)如何,下面的查询都会给出相同的结果. select * from tips order by (likes - dislikes - (array_length(abuse_history,1) * 5)) ASC limit 2147483647 offset 0 编辑 我插入了3条具有以下值的记录: 无论排序顺序(ASC / DESC)如何,我都会得到以下顺序: 有谁能请我指出正确的方向? 解决方法
考虑一下:
SELECT array_length('{}'::character varying(16)[],1); 空数组的输出为NULL.此外,您的abuse_history本身也可以为NULL.所以你需要这样的东西: SELECT * FROM tips ORDER BY (likes - dislikes - COALESCE(array_length(abuse_history,1) * 5,0)) DESC; 反馈后编辑: 在PostgreSQL 9.0中工作,如本演示所示: CREATE TABLE tips ( tip_id bigserial NOT NULL,tip text,author text,post_date bigint,likes integer,dislikes integer,abuse_history character varying(16)[] ); INSERT INTO tips (likes,dislikes,abuse_history) VALUES(1,'{}'),(1,(0,'{stinks!,reeks!,complains_a_lot}'); SELECT tip_id,likes,(likes - dislikes - COALESCE(array_upper(abuse_history,0)) as pop,(likes - dislikes - array_upper(abuse_history,1) * 5) as fail_pop FROM tips ORDER BY (likes - dislikes - COALESCE(array_upper(abuse_history,0)) DESC; 输出: tip_id | likes | dislikes | pop | fail_pop --------+-------+----------+-----+---------- 1 | 1 | 0 | 1 | 2 | 1 | 0 | 1 | 4 | 0 | 0 | 0 | 3 | 0 | 1 | -1 | 5 | 1 | 0 | -14 | -14 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |