一尘不染

MS SQL Server与MySQL FIELD()函数有什么相似之处?

mysql

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

FIELD('d', 'a', 'b', 'c', 'd', 'e', 'f')

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

此功能提供了根据非常特定的顺序对查询结果进行排序的功能。对于我当前的应用程序,我需要管理四种状态:有效,已批准,已拒绝和已提交。但是,如果仅按状态列排序,我会感觉结果列表的可用性降低了,因为拒绝和活动状态项比已提交和已批准的项更为重要。

在MySQL中,我可以这样做:

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

然后对结果进行排序,以使被拒绝的物品首先出现,然后是活动的物品,依此类推。因此,结果按对访客的重要性降低的顺序排序。

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

谢谢
大卫·基斯


阅读 391

收藏
2020-05-17

共1个答案

一尘不染

使用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

您可以使用此语法进行更复杂的评估(包括组合,或者如果需要使用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
2020-05-17