【问题标题】:ORDER BY ... IN(...) ASC订购方式... IN(...) ASC
【发布时间】:2015-08-16 11:18:08
【问题描述】:

我想首先获取特定位置的所有配置文件:

SELECT * FROM profile
WHERE location IN ('a', 'b', 'c') OR isDefault=1 
ORDER BY location IN ('a', 'b') DESC, -- put to the front if location in 'a','b'
         isDefault DESC,              -- for each of both groups, put default profiles before the others.
         location ASC                 -- and sort each of the up to four groups by location.

这会引发错误:“关键字 'IN' 附近的语法不正确。”。如果我删除 order 子句,则返回结果。

这里有什么问题?

【问题讨论】:

  • 您的请求可能存在的问题是,除了IN 不允许在ORDER BY 中这一事实之外,您选择的位置不会有内部排序“在正面”。这真的是你想要的吗? ab 会排在最前面,但可能是 ba
  • @Mackan location ASC 会对它们进行排序,所以 a 总是在 b 前面(如果两者的 isDefault 相同),甚至如果我查询 ORDER BY location IN('b', 'a'),并且这完全是故意的。
  • 没错,我不知道我在想什么——但我的想法完全有道理;-)

标签: sql sql-server


【解决方案1】:

如果您使用的是 SQL Server 2012 或更高版本,则可以使用 IIF() 命令将真/假表达式转换为使用最少代码的结果。

ORDER BY IIF(location IN ('a','b'), 1, 0) ASC

【讨论】:

    【解决方案2】:

    所以 ORDER BY 语法是:

    ORDER BY column_name ASC|DESC, column_name ASC|DESC
    

    所以

    位置 IN ('a', 'b')

    是默认的

    位置

    必须是列名

    试试:

    location DESC
    isDefault DESC
    

    IN 也只能用在 WHERE 子句中

    来源:

    http://www.w3schools.com/sql/sql_in.asp

    http://www.w3schools.com/sql/sql_orderby.asp

    【讨论】:

      【解决方案3】:

      你可以重写它以返回一个可排序的整数:

      case when location IN ('a', 'b') then 0 else 1 end DESC
      

      【讨论】:

      【解决方案4】:

      您不能在ORDER BY 中使用IN。将其更改为:

      ORDER BY location ASC, --will sort a, then b, then c
      

      【讨论】:

      • 那将如何排序@?由于@ 的ASCII 值低于a,它会先出现,而不是a
      • @PatrickHofman 考虑到WHERE location IN ('a', 'b', 'c'),@ 会如何出现?
      • 地址@现在在a之前。
      • @ 不是这里的问题。这只是一个例子。 OP 显然想要优先排序中的某些位置,然后这将不起作用。但我认为这个问题有点不清楚,使用 a, b, c 会使情况变得更糟,所以 +1 解决方案:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-29
      • 1970-01-01
      • 2020-08-31
      • 2013-12-22
      • 2018-09-09
      • 1970-01-01
      • 2013-06-30
      相关资源
      最近更新 更多