【问题标题】:Order by "In clause"按“In 子句”排序
【发布时间】:2014-11-30 19:20:54
【问题描述】:

我有一个查询,其中我使用了“In”子句。 现在我希望结果集的顺序与我的 In 子句相同。 例如 -

select Id,Name from mytable where id in (3,6,7,1)

结果集:

|Id | Name |
------------
| 3 |  ABS |
| 6 |  NVK |
| 7 |  USD |
| 1 |  KSK |

我不想使用任何临时表。 是否有可能在一个查询中实现目标?

【问题讨论】:

  • 将 3,6,7,1 放入一个表中,INNER JOIN 到它,ORDER BY 它
  • 这是面试题吗?你为什么要这样做?为什么只使用 1 个查询?如果是真正的需求,您可能会有数千行,而不是只有 4 行。
  • @Meet 这不是面试问题,但是是的,一位同事用这个欺骗了我,他确实为我们的团队接受了面试:-)

标签: sql tsql sybase ase


【解决方案1】:

在 T-SQL 中,您可以使用大的case

select Id, Name
from mytable
where id in (3, 6, 7, 1)
order by (case id when 3 then 1 when 6 then 2 when 7 then 3 else 4 end);

或者charindex():

order by charindex(',' + cast(id as varchar(255)) + ',',
                   ',3,6,7,1,')

【讨论】:

  • 我认为他只希望在 sybase 中使用这个,而不是在 MSSQL 中。所以没有charindex会起作用
  • @AnkitBajpai 。 . . Sybase 支持charindex()
  • 是的,Sybase ASE 15 确实支持 charindex() - 我在一开始就尝试使用 charindex,但可能想错了。但我得到了戈登的两种逻辑的结果。谢谢!
【解决方案2】:

你也可以使用 CTE

with filterID as 
(
  3 ID, 1 as sequence
  union 
  6, 2
  union 
  7, 3
  union 
  1, 4
)

select mytable.* from mytable 
inner join filterID on filterID.ID = mytable.ID
order by filterID.sequence ;

【讨论】:

    猜你喜欢
    • 2018-07-19
    • 2010-09-28
    • 2012-02-15
    • 2011-01-12
    • 2021-12-28
    • 1970-01-01
    • 2012-04-30
    • 1970-01-01
    相关资源
    最近更新 更多