我试图按功能找到自定义订单的解决方案。
我有一个表格,可以用文本字段和整数类别值简化为:
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);
答案 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,请为其指定最大值。
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在设计数据库时应该处理的事情。