前段时间发现了这个,从那以后一直在用;但是今天看了,我发现我并不完全理解它为什么有效,有人能给我解释一下吗?
ORDER BY s.type!= 'Nails',
s.type!= 'Bolts',
s.type!= 'Washers',
s.type!= 'Screws',
s.type!= 'Staples',
s.type!= 'Nuts', ...
如果我按类型排序,它是按字母顺序排序的。如果我使用上面的例子,它使用与行位置相同的顺序。我不明白的是!=的使用。如果我使用=,它会以相反的顺序出现。我无法理解这个概念。
我认为用“=”代替上面的“!=”会把“钉子”放在第一个位置,但事实并非如此,它会把“钉子”放在最后一个位置。我想我的问题是:在这种情况下,为什么我必须使用!=,而不是=?
5条答案
按热度按时间lc8prwob1#
@Scott Bailey提出了一个好主意。但是自从PostgreSQL 9.5以来,它可以更简单(你不必创建自定义函数)。只需使用
array_position
函数:4jb9z9bj2#
每一个表达式都被当作布尔值来计算,0代表false,1代表true,并进行适当的排序。即使这样做是可行的,逻辑也很难遵循(因此也很难维护)。我使用的是一个函数,它在数组中找到一个值的索引。
这就更容易理解了。钉子将首先排序,坚果将最后排序。您可以看到如何在Postgres代码片段库中创建idx函数。http://wiki.postgresql.org/wiki/Array_Index
1u4esq0p3#
我从来没见过,但它似乎是有道理的。
首先,它按
s.type != 'Nails'
排序,对于type
列中包含Nails
的每一行,它都是false
,之后,它按Bolts
排序,对于所有包含Bolts
的列,它的值都是false,依此类推。一个小的测试显示
false
的顺序在true
之前。首先,您会得到所有Nails
在最上面的行,因为计算结果为false
和false
的相应ORDER BY
排在最前面。其余行按第二个ORDER BY
标准排序,依此类推。kxeu7u2r4#
使用array_position时,它的类型必须与查询的类型相同。
例如:
lb3vh1jj5#
这是按给定的值列表排序。
从Postgres 9.4开始,一个干净的解决方案是
LEFT JOIN
到一个非嵌套数组WITH ORDINALITY
和ORDER BY
得到序数:fiddle
请参阅: