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

Posted

技术标签:

【中文标题】类似于 MySQL FIELD() 函数的 MS SQL Server 功能是啥?【英文标题】:What is the MS SQL Server capability similar to the MySQL FIELD() function?类似于 MySQL FIELD() 函数的 MS SQL Server 功能是什么? 【发布时间】:2011-04-22 23:41:18 【问题描述】:

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() 的内置函数来避免额外的表和更复杂的查询。

谢谢你, 大卫基斯

【问题讨论】:

【参考方案1】:
ORDER BY CHARINDEX(','+convert(varchar,status)+',' ,   
  ',rejected,active,submitted,approved,')


just put a comma before and after a string in which you are finding the substring index or you can say that second parameter.

and first parameter of charindex is also surrounded by ,  

【讨论】:

【参考方案2】:

对于您的特定示例,您可以:

ORDER BY CHARINDEX(
    ',' + status + ',',
    ',rejected,active,submitted,approved,'
)

请注意,FIELD 应该返回 0、1、2、3、4,而上面将返回 0、1、10、17 和 27,所以这个技巧只在 order by 子句中有用。

【讨论】:

【参考方案3】:

我推荐 CTE(SQL server 2005+)。 无需重复状态码或创建单独的表格。

WITH cte(status, RN) AS (  -- CTE to create ordered list and define where clause
      SELECT 'active', 1
UNION SELECT 'approved', 2
UNION SELECT 'rejected', 3
UNION SELECT 'submitted', 4
)
SELECT <field1>, <field2>
FROM <table> tbl
INNER JOIN cte ON cte.status = tbl.status  -- do the join
ORDER BY cte.RN  -- use the ordering defined in the cte

祝你好运,

杰森

【讨论】:

【参考方案4】:

使用CASE expression(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

【讨论】:

以上是关于类似于 MySQL FIELD() 函数的 MS SQL Server 功能是啥?的主要内容,如果未能解决你的问题,请参考以下文章

ms访问,追加查询

MySQL中的Field()在hive中有啥功能吗?

MS Access - 将两个 SELECT 语句与一个包含聚合函数的语句联合

MongoDB 中的结果顺序与 $in 类似 MySQL field('_id', ...)

MongoDB 中的结果顺序与 $in 类似 MySQL field('_id', ...)

相当于 MySQL 多表内连接的 Google BigQuery