自定义ORDER BY说明

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

  • 应该是`array_position` (4认同)
  • @EbenGeer仅限9.5及以上 (4认同)

mus*_*iKk 38

我从来没有见过它,但似乎有道理.

起初它按顺序排序s.type != 'Nails'.这是false一个包含每一行Nailstype列.之后按照排序Bolts.同样对于那些包含所有列Boltstype这个计算结果为false.等等.

一个小测试显示false之前订购过true.所以你有以下几点:首先你得到所有的行,Nails因为根据ORDER BY评估falsefalse来到第一.其余行按第二个ORDER BY标准排序.等等.

 type     | != Nails | != Bolts | != Washers
'Nails'   | false    | true     | true
'Bolts'   | true     | false    | true
'Washers' | true     | true     | false

  • 这纯粹是一个想法。但我假设它在 true 之前将 false 排序,因为它们尊重整数值 0 和 1,其中 0 (false) 出现在 1 (true) 之前。 (3认同)

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)

  • 这适用于`Text`类型的列,我尝试使用列类型`字符`并且函数引发了错误 - 希望这有助于:) (3认同)
  • 类似的问题也将有助于您可能需要做的任何转换:https://dba.stackexchange.com/questions/201837/order-by-gives-error-function-array-positiontext-character-varying-does-不 (3认同)

lif*_*ent 6

使用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)