【问题标题】:Want to see query result order as written in query想查看查询中写的查询结果顺序
【发布时间】:2018-02-02 23:21:50
【问题描述】:

我写了一个查询,我想在查询中显示员工的顺序。查询如下

select * from employeemaster where employeename in
 ('Sachin','Gaurav','Vinay','Shiv','Sandeep','Vaibhav','Prashant')   

我想查看查询结果首先显示 Sachin,然后再显示其他人,在这种情况下,员工的 ID 不是按顺序排列的,例如。 Sachin 的 ID 可以是 4,Vinay 的 ID 可以是 1。但是因为我已经将 Sachin 写在首位,所以我希望看到 Sachin 在结果中首先开始。

【问题讨论】:

  • 这里接受的答案应该能让你达到目标CASE WHEN statement for ORDER BY clause
  • 对结果集排序只有一个,即使用order by子句。上面的查询中没有任何内容可以提供此订单。
  • 我不认为建议的副本是一回事。这里的 OP 希望结果的顺序与 IN 子句的值相同。我怀疑重点是接收姓名列表并以相同的顺序返回它们。副本中接受的答案会起作用,但不像 OP 在此处搜索的那样是动态的。
  • 可能是@SeanLange,但是,如果是这种情况,我们将需要更多细节。最重要的是,如果它是动态的,那么该列表是如何进入查询的?这样我们就可以计算出如何动态地对其进行排序。
  • @Larnu 我同意我们需要更多细节。但是当细节如此稀疏时,我认为不应该将其标记为重复。

标签: sql-server


【解决方案1】:

您可以使用带有 ID 的 CTE 进行排序,并通过内部连接进行过滤。

WITH cte as (
    SELECT *
    FROM (VALUES
        (1,'Sachin')
        ,(2,'Gaurav')
        ,(3,'Vinay')
        ,(4,'Shiv')
        ,(5,'Sandeep')
        ,(6,'Vaibhav')
        ,(7,'Prashant')
        ) a (id, [name])
    )
SELECT em.*
FROM employeemaster em
JOIN cte
    ON em.employeename = cte.[name]
ORDER BY cte.id

【讨论】:

  • 跟我的想法差不多。因为我猜测 OP 是从某个地方传入列表的,所以我在想一个表值参数,其中表类型有一个标识列,因此您可以轻松地按它排序。
  • 我想我迟到了!我把窗户打开了一会儿,没有看到这个答案。
【解决方案2】:
select * from employeemaster 
join (values
    ('Sachin',1)
    ,('Gaurav',2)
    ,('Vinay',3)
    ,('Shiv',4)
    ,('Sandeep',5)
    ,('Vaibhav',6)
    ,('Prashant',7))  a(employeename ,_order) on a.employeename = employeemaster.employeename 
order by a.[_order]

【讨论】:

    猜你喜欢
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多