什么是MS SQL Server功能类似于MySQL FIELD()函数?

Das*_*ash 14 mysql sql t-sql sql-server sql-order-by

MySQL提供了一个名为FIELD()的字符串函数,它接受可变数量的参数.返回值是剩余值列表中第一个参数的位置.换一种说法:

FIELD('d', 'a', 'b', 'c', 'd', 'e', 'f')
Run Code Online (Sandbox Code Playgroud)

将返回4,因为'd'是第一个之后的第四个参数.

此函数提供基于非常特定的排序对查询结果进行排序的功能.对于我目前的申请,我需要管理四种状态:活跃,已批准,拒绝和提交.但是,如果我只是按状态列进行排序,我觉得结果列表的可用性会降低,因为被拒绝的活动状态项比提交和批准的项更重要.

在MySQL中,我可以这样做:

SELECT <stuff> FROM <table> WHERE <conditions> ORDER BY FIELD(status, 'rejected', 'active','submitted', 'approved')
Run Code Online (Sandbox Code Playgroud)

并且将对结果进行排序,以便首先拒绝项目,然后是活动项目,依此类推.因此,结果的排序降低了对访客的重要性.

我可以创建一个单独的表来枚举状态的这个重要性级别,然后按降序排序查询,但是自从切换到MS SQL Server以来,这已经出现了几次,所以我想我会查询到是否可以使用类似于MySQL的FIELD()的内置函数来避免额外的表和更复杂的查询.

谢谢
David Kees

OMG*_*ies 23

使用CASE表达式(SQL Server 2005+):

ORDER BY CASE status
           WHEN 'active' THEN 1
           WHEN 'approved' THEN 2
           WHEN 'rejected' THEN 3
           WHEN 'submitted' THEN 4
           ELSE 5
         END
Run Code Online (Sandbox Code Playgroud)

您可以使用此语法进行更复杂的评估(包括组合,或者如果您需要使用LIKE)

ORDER BY CASE 
           WHEN status LIKE 'active' THEN 1
           WHEN status LIKE 'approved' THEN 2
           WHEN status LIKE 'rejected' THEN 3
           WHEN status LIKE 'submitted' THEN 4
           ELSE 5
         END
Run Code Online (Sandbox Code Playgroud)