SQL ORDER BY,在列表末尾获取负值

时间:2018-06-12 11:24:12

标签: sql postgresql

我试图按功能找到自定义订单的解决方案。

我有一个表格,可以用文本字段和整数类别值简化为:

text      | category
----------------------
'Item 1'  | 3
'Item 2'  | -1
'Item 3'  | 2
'Item 4'  | -1
'Item 5'  | 3
'Item 6'  | 1

整数值-1表示未使用该类别。

我想要做的是按类别排序并在结尾处获得-1值,例如。结果如下:

text      | category
----------------------
'Item 6'  | 1
'Item 3'  | 2
'Item 1'  | 3
'Item 5'  | 3
'Item 2'  | -1
'Item 4'  | -1

我无法触摸存储在数据库中的数据,我想避免存储过程。

我正在使用Postgres 9.2。

我试图在这里创建一个在线测试: https://www.db-fiddle.com/f/6pTQgKyiJYQwHBjrx8rSWZ/0#&togetherjs=PCph5kuFn1

创建测试表的SQL:

CREATE TABLE test_order
(
text text,
category integer
);
INSERT INTO test_order values('Item 1',3);
INSERT INTO test_order values('Item 2',-1);
INSERT INTO test_order values('Item 3',2);
INSERT INTO test_order values('Item 4',-1);
INSERT INTO test_order values('Item 5',3);
INSERT INTO test_order values('Item 6',1);

6 个答案:

答案 0 :(得分:1)

order by

中使用多个键
order by (category >= 0)::int desc, category asc

将布尔值转换为整数时," true"具有" 1"的值和假" 0"。因此desc使用order by

答案 1 :(得分:0)

其他选项是使用 UNION ALL

(select * from test_order
where category >= 0
Order By category)
UNION ALL
(select * from test_order
where category = -1)

第一个选择只是按顺序按运算符排序。然后我们将 category = -1 的剩余行添加到第一个选择的行中。

答案 2 :(得分:0)

对于 SQL Server ,您可以使用以下查询:

SELECT tor.texts, tor.category
FROM #test_order AS tor
ORDER BY REPLACE(tor.category
           , -1
           , (   SELECT MAX(category) + 1
                 FROM #test_order))
  , tor.texts;

答案 3 :(得分:0)

Postgres将NULL视为默认最高值,因此这将起作用:

SELECT * 
FROM test_order 
ORDER BY NULLIF(category, -1), text;

如果您想降序标准SQL的NULLS,也支持FIRST / LAST:

ORDER BY 
   NULLIF(category, -1) DESC NULLS LAST, text

关于DISTINCT ON,你必须在DISTNCT和ORDER中使用相同的表达式:

SELECT DISTINCT ON (text,NULLIF(category, -1)) text,category 
FROM test_order 
ORDER BY NULLIF(category, -1) NULLS LAST, text;

请参阅fiddle

答案 4 :(得分:0)

如果类别为-1,请为其指定最大值。

Updated fiddle here

SELECT
            O.text,
            O.category
    FROM
            test_order O
    ORDER BY
            CASE
                WHEN category = -1 THEN 2147483647
                ELSE category
            END,
            text;

答案 5 :(得分:0)

SELECT NULLIF(category, -1) as nulled_category, * 
from test_order 
ORDER BY nulled_category ASC nulls last, text;

这是DBA在设计数据库时应该处理的事情。