【问题标题】:Sort SQL query by order of where clause match按 where 子句匹配的顺序对 SQL 查询进行排序
【发布时间】:2014-05-02 14:46:40
【问题描述】:
SELECT 
    ProcductCode AS Id, 
    ProductPrice AS Price
FROM 
    Products WITH (NOLOCK)
WHERE 
    ProductCode = 'efg' OR ProductCode = 'abc' OR  ProductCode = 'xyz'

在上面的查询中,我希望返回的数据按ProductCode 的顺序排列,但不是默认的升序或降序,而是按 where 子句找到匹配项的顺序。

我不想

ORDER BY ProductCode ASC|DESC; 

所以在上面的例子中,如果我们假设表中有一个 ProductCode 条目,用于 where 子句中的所有三个,那么它应该返回

ID             Price
---------------------
efg            1.00
abc            1.00  
xyz            1.00

有没有办法按“或”顺序排序。有点坚持这一点。想法和/或示例会有所帮助

【问题讨论】:

    标签: sql sql-server-2008 sql-server-2005


    【解决方案1】:

    您可以使用case。使用in,您的where 子句更易于阅读:

    SELECT ProcductCode AS Id, ProductPrice AS Price
    FROM Products WITH (NOLOCK)
    WHERE ProductCode IN ('efg', 'abc', 'xyz')
    ORDER BY (CASE WHEN ProductCode = 'efg' THEN 1
                   WHEN ProductCode = 'abc' THEN 2
                   WHEN ProductCode = 'xyz' THEN 3
                   ELSE 4  -- in case you change the `where`, put them last
              END);
    

    顺便说一句,如果你愿意,你可以这样做:

    ORDER BY CHARINDEX(','+ProductCode+',',
                       ',efg,abc,xyz,'
                      )
    

    【讨论】:

    • 您的两个解决方案都有效,但我对 Charindex 而不是 Case 更感兴趣。我的理解是否正确,它正在检查每个“匹配的”产品代码在字符串“,efg,abc,xyz”中的索引,并根据找到该产品代码的位置按顺序返回它?所以在这种情况下,字符索引为 2、6、10。如果不是,那么如果我错了,你能解释发生了什么。 THX
    • @user357034 。 . .是的。这就是它的工作原理。它使用分隔符,因此 'ef' 不会计算 'efg'
    【解决方案2】:
    ORDER BY CASE WHEN ProcductCode  = 'efg' THEN 1 
                  WHEN ProcductCode  = 'abc' THEN 2
                  WHEN ProcductCode  = 'xyz' THEN 3
             END ASC    
    

    【讨论】:

    • 哇,这是一个快速的投票,我可以知道原因吗?
    • 老兄,在你问“为什么要投反对票”之前,我会留下我的意见(这不是我的)。我认为这个问题只是一个例子,你的回答对于那个特定的查询来说太具体了
    • @GordonLinoff 好吧,操作确实使用了ProductCode AS ID,所以....无论如何,我不应该猜测其他人的反对意见
    • 好点 Lamak 你希望我创建另一个例子并用它来解释他还是使用 OP 的例子更方便?
    • @GordonLinoff 先生,别名是 ID :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 2012-04-30
    相关资源
    最近更新 更多