【问题标题】:PostgreSQL -- Ordering resuts depending on 2 columns logically groupedPostgreSQL——排序结果取决于逻辑分组的 2 列
【发布时间】:2022-01-16 19:30:58
【问题描述】:

想象一下这样的表格,有 100 多个字段,我将其缩小

     the_id | company        |   abcd     | master_id
   ---------+----------------+------------+------------------
        500 | M-803          |            |                0
        501 | M-803          |            |                0
        502 | M-803          |            |                0
        503 | M-803          |            |                0
        504 | M-803          |            |                0
        507 | M-803          | 45 KK 526  |              505
        506 | M-803          | ARC0032    |              505
        505 | M-803          | 355 KKK 65 |                0
        476 | M-803          |            |                0
        508 | M-803          | ARC0032    |              504
        515 | N-0052         |            |                0
        516 | N-0052         |            |                0
        517 | N-0052         |            |                0
        518 | N-0052         |            |                0
        519 | N-0052         | 42 FDR 03  |              515

我想这样排序查询结果

     the_id | company        |   abcd     | master_id
     -------+----------------+------------+------------------
        500 | M-803          |            |                0
        501 | M-803          |            |                0
        502 | M-803          |            |                0
        503 | M-803          |            |                0
        504 | M-803          |            |                0
        508 | M-803          | ARC0032    |              504
        505 | M-803          | 355 KKK 65 |                0
        507 | M-803          | 45 KK 526  |              505
        506 | M-803          | ARC0032    |              505
        476 | M-803          |            |                0
        515 | N-0052         |            |                0
        519 | N-0052         | 42 FDR 03  |              515
        516 | N-0052         |            |                0
        517 | N-0052         |            |                0
        518 | N-0052         |            |                0

第一个主 ID,然后是分组的详细字段

有什么想法吗?

【问题讨论】:

  • 我已经删除了垃圾邮件标签。 Edit 请正确标记您的问题。谢谢。
  • 我不认为这是 dbms realated,它更像是 sql realted.. 我正在使用 postgresql
  • 你可以连接一些列并按连接的列排序?
  • 你能解释一下你需要的排序逻辑吗,看预期的查询结果时不清楚。在任何情况下,您都可以根据 FROM 子句中查询表的任何列列表和/或 SELECT 子句中的字段对查询进行排序。

标签: sql postgresql


【解决方案1】:

您似乎希望master_id 在非零时优先于the_id

order by case when master_id <> 0 then master_id else the_id end

如果您更愿意将其视为合并操作,也可以使用coalesce() 编写。如果你有空值而不是零,那么nullif() 是不必要的:

order by coalesce(nullif(master_id, 0), the_id)

我不清楚您是要按像 abcd 这样的次要详细值还是按非主 the_id 排序。

【讨论】:

  • master_id 不为空,如果未分配值,则始终为 0..
  • Burak,这就是我将它与零进行比较的原因。
【解决方案2】:

我通过像 sebastian siemens 所说的“连接一些列”来整理它..

SELECT  ( 
     (case 
        when master_id = 0 then 
            RPAD(the_id::varchar,10,'0') 
        else 
            RPAD(master_id::varchar,10,'0') 
     end) 
      ||RPAD(the_id::varchar,10,'0') )as TheNEwID
,*
from table
ORDER BY TheNEwID ASC

TheNEwID|the_id |公司| abcd | master_id ----------------+----------------+------------+--- --------------- 500500 | 500 | M-803 | | 0 501501 | 501 | M-803 | | 0 502502 | 502 | M-803 | | 0 503503 | 503 | M-803 | | 0 504504 | 504 | M-803 | | 0 504508 | 508 | M-803 | ARC0032 | 504 505505 | 505 | M-803 | 355 KKK 65 | 0 505507 | 507 | M-803 | 45 KK 526 | 505 505506 | 506 | M-803 | ARC0032 | 505 515515 | 515 | N-0052 | | 0 515519 | 519 | N-0052 | 42 罗斯福 03 | 515 516516 | 516 | N-0052 | | 0 517517 | 517 | N-0052 | | 0 518518 | 518 | N-0052 | | 0

非常感谢

【讨论】:

  • 你能edit你的答案来添加你的请求,这样也许可以帮助其他人回答你的问题吗?
  • 如上所示,按照这个逻辑,507 和 506 是乱序的。
猜你喜欢
  • 2010-12-21
  • 2022-01-12
  • 2016-10-27
  • 2017-08-14
  • 2011-11-30
  • 1970-01-01
  • 2020-08-27
  • 1970-01-01
  • 2014-01-30
相关资源
最近更新 更多