【问题标题】:sorting sql query results in various ways depending on data value根据数据值以各种方式对sql查询结果进行排序
【发布时间】:2017-07-14 10:04:09
【问题描述】:

给定以下 sql 查询的结果:

1,
4,
Red,
Blue,
3,
Green,
2,
Yellow,
Magneta,
Rubi

我想要达到的正确顺序是:

红、蓝、绿、磁、红宝石、黄、1、2、3、4

  • 红色、蓝色和绿色必须始终位于顶部并按顺序排列
  • 那么,alpha 项应遵循 asc (M,R,Y) 顺序
  • 按照数字项升序排列到 (1, 2, 3...)

我一直在玩以下无济于事,所以如果有人能指出我正确的方向

SELECT myCol FROM myTable
ORDER BY
CASE WHEN myCol='Red' then 1
     WHEN myCol='Blue' then 2
     WHEN myCol='Green' then 3 END,
CASE
     WHEN myCol not in ('Red','Blue','Green') and IsNumeric(party_id) = 0 then myCol END ASC,
CASE
     WHEN myCol not in ('Red','Blue','Green') and IsNumeric(party_id) = 1 then CAST(myCol AS INT) END ASC

谢谢!

编辑 1: 我当前的订单实际上正在退货:

1,2,3,4, Magneta, Rubi, Yellow, Red, Blue, Green

【问题讨论】:

  • 您使用的是哪个 dbms? (那里有一些特定于产品的 SQL...)
  • 对不起,我忘记了:MicrosoftSQL Server 2014

标签: sql sql-server sql-order-by


【解决方案1】:

你可以试试这个

SELECT myCol 
FROM myTable
ORDER BY
    CASE WHEN myCol='Red' THEN 1
        WHEN myCol='Blue' THEN 2
        WHEN myCol='Green' THEN 3 
        ELSE 4
    END,
    CASE
        WHEN myCol NOT IN ('Red','Blue','Green') AND IsNumeric(party_id) = 1 
            THEN CAST(myCol AS INT) 
        ELSE -1 
    END,
    CASE
        WHEN myCol NOT IN ('Red','Blue','Green') AND IsNumeric(party_id) = 0 
            THEN myCol 
    END;

【讨论】:

  • 像魅力一样工作!为了完全理解它,我真的很感激对正在发生的事情发表评论。干杯!
  • 对于您的问题,您可以使用CASE 搜索并查看,否则如果您不设置值,则默认值将是 NULL 和 SQL Server ORDER NULL 首先,所以你明白了错误的结果。我的查询是为CASE 设置默认值的一种方法,以便结果将按您的 3 个预期组排序:RGB、数字和其他 varchar。
猜你喜欢
  • 2015-04-27
  • 2016-03-17
  • 1970-01-01
  • 2013-04-30
  • 2013-08-09
  • 2017-05-09
  • 1970-01-01
  • 2011-09-28
相关资源
最近更新 更多