SQL ORDER BY按特定顺序的多个值?
好吧,我有一个索引键和非索引字段的表。 我需要find具有特定值的所有logging并返回该行。 我想知道是否可以通过多种价值订购。
例:
id x_field -- ----- 123 a 124 a 125 a 126 b 127 f 128 b 129 a 130 x 131 x 132 b 133 p 134 p 135 i
伪:想要结果这样sorting, where ORDER BY x_field = 'f', 'p', 'i', 'a'
SELECT * FROM table WHERE id NOT IN (126) ORDER BY x_field 'f', 'p', 'i', 'a'
所以结果是:
id x_field -- ----- 127 f 133 p 134 p 135 i 123 a 124 a 125 a 129 a
语法是有效的,但是当我执行查询时,它永远不会返回任何结果,即使我将其限制为1条logging。 还有另外一种方法可以解决这个问题吗?
把x_field看作是testing结果,我需要validation条件下的所有logging。 我想通过失败的值来排列testing结果,传递值。 所以我可以先validation失败的值,然后使用ORDER BY传递值。
我不能做的事情:
- GROUP BY,因为我需要返回特定的logging值
- WHERE x_field IN('f','p','i','a'),我需要所有的值,因为我试图使用一个查询进行多个validationtesting。 而x_field值不是以DESC / ASC顺序
写完这个问题后,我开始认为我需要重新思考这个,哈哈!
... WHERE x_field IN ('f', 'p', 'i', 'a') ... ORDER BY CASE x_field WHEN 'f' THEN 1 WHEN 'p' THEN 2 WHEN 'i' THEN 3 WHEN 'a' THEN 4 ELSE 5 --needed only is no IN clause above. eg when = 'b' END, id
您可以使用“VALUES('f',1),('p',2),('a',3),('i',4)”的左连接,并使用您的订单中的第二列通过expression。 如果你有很多值,Postgres将会使用一个Hash Join,这将比一个巨大的CASE快得多。 自动生成更容易。
如果这个订购信息是固定的,那么它应该有它自己的表格。
尝试:
ORDER BY x_field='F', x_field='P', x_field='A', x_field='I'
你在正确的轨道上,但是通过只把x_field放在F值上,其他三个被视为常量,而不是与数据集中的任何东西进行比较。
使用case
开关将代码转换为可以sorting的数字:
ORDER BY case x_field when 'f' then 1 when 'p' then 2 when 'i' then 3 when 'a' then 4 else 5 end
CASE
和ORDER BY
build议应该都可以工作,但我会build议一种不同颜色的马。 假设x_field
只有合理数量的值,并且您已经知道它们是什么,请创build一个以F,P,A和I作为值的枚举types (以及其他可能的值适用)。 枚举将按照它们的CREATE
语句所暗示的顺序进行sorting。 而且,你可以使用有意义的值名称 – 你真正的应用程序可能会这样做,你只是掩盖了他们的机密性 – 没有浪费空间,因为只有序号位置被存储。