Evi*_*Elf 55 postgresql sql-order-by
我不久前发现了这个,并且从那时起就一直在使用它; 然而,今天看着它,我意识到我并不完全理解为什么它有效.有人可以为我解释一下吗?
ORDER BY s.type!= 'Nails',
s.type!= 'Bolts',
s.type!= 'Washers',
s.type!= 'Screws',
s.type!= 'Staples',
s.type!= 'Nuts', ...
Run Code Online (Sandbox Code Playgroud)
如果我按s.type订购,则按字母顺序排序.如果我使用上面的示例,它使用与行位置相同的顺序.我不明白的是使用!=.如果我使用=它会以相反的顺序出现.我无法理解这个概念.
我会告诉我,使用=代替上面的!=将Nails放在第一位,但它没有,它把它放在最后.我想我的问题是:为什么我必须使用!=,not =在这种情况下?
Sco*_*ley 53
每个表达式都被评估为bool,并将其视为0表示false,1表示true表示并适当排序.即使这有效,但逻辑很难遵循(并因此维持).我使用的是一个在数组中查找值索引的函数.
ORDER BY idx(array['Nails','Bolts','Washers','Screws','Staples','Nuts'], s.type)
Run Code Online (Sandbox Code Playgroud)
这更容易遵循.钉子将先排序,坚果排序.您可以在Postgres代码段存储库中查看如何创建idx函数. http://wiki.postgresql.org/wiki/Array_Index
mus*_*iKk 38
我从来没有见过它,但似乎有道理.
起初它按顺序排序s.type != 'Nails'.这是false一个包含每一行Nails的type列.之后按照排序Bolts.同样对于那些包含所有列Bolts的type这个计算结果为false.等等.
一个小测试显示false之前订购过true.所以你有以下几点:首先你得到所有的行,Nails因为根据ORDER BY评估false 和false来到第一.其余行按第二个ORDER BY标准排序.等等.
type | != Nails | != Bolts | != Washers 'Nails' | false | true | true 'Bolts' | true | false | true 'Washers' | true | true | false
Dan*_*kov 37
@Scott Bailey提出了很棒的主意.但是自PostgreSQL 9.5以来它可以更简单(你不必创建自定义函数).只需使用array_position功能:
ORDER BY array_position(array['Nails','Bolts','Washers','Screws','Staples','Nuts'], s.type)
Run Code Online (Sandbox Code Playgroud)
使用array_position,它需要具有您要查询的相同类型.
例如:
select array_position(array['foo'::char,'bar','baz'::char], 'bar');
select array_position(array['foo'::char,'bar','baz'::char], 'baz'::char);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16819 次 |
| 最近记录: |