按特定字段值排序 SQL 查询

Posted

技术标签:

【中文标题】按特定字段值排序 SQL 查询【英文标题】:Ordering SQL query by specific field values 【发布时间】:2010-09-28 17:56:35 【问题描述】:

我有一个 sql 查询(使用 Firebird 作为 RDBMS),我需要在其中按字段 EDITION 对结果进行排序。但是,我需要按字段的内容排序。即“NE”排在第一位,“OE”排在第二位,“OP”排在第三位,空白排在最后。不幸的是,我不知道如何实现这一点。我所做的只是 ORDER BY [FIELD] ASC/DESC,仅此而已。

有什么建议吗?

编辑:我真的应该澄清一下:我只是希望在这里了解更多信息。我现在有了它,我只有多个选择语句来定义首先显示哪个。查询相当大,我真的希望学习一种更有效的方法: 示例:

SELECT * FROM RETAIL WHERE MTITLE LIKE 'somethi%' AND EDITION='NE'
UNION 
SELECT * FROM RETAIL WHERE MTITLE LIKE 'somethi%' AND EDITION='OE'
UNION
SELECT * FROM RETAIL WHERE MTITLE LIKE 'somethi%' AND EDITION='OP'
UNION (etc...)

【问题讨论】:

建议的解决方案都不需要多重选择/联合。它们都应该更快、更容易维护,查询也更容易阅读。 我要和 Peter LaComb 一起做这个。你为什么使用UNION?没有必要我会选择 SELECT * FROM Retail WHERE MTITLE LIKE 'somethi%' AND EDITION IN ('NE', 'OE', 'OP', '') ORDER BY CASE EDITION When 'NE' Then 1 When 'OE' Then 2 When 'OP' Then 3 Else 4 End @Pulsehead 你可以在这个 *** 问题中找到为什么我会在某个地方使用联合的答案,关于不知道排序字段的最佳方式。 【参考方案1】:
Order By Case Edition
    When 'NE' Then 1
    When 'OE' Then 2
    When 'OP' Then 3
    Else 4 End 

【讨论】:

哦!比我做的更精简。我必须记住你的解决方案。 确实——我以前没见过这种语法。【参考方案2】:
SELECT 
  /*other fields*/
  CASE WHEN 'NE' THEN 1
    WHEN "OE" THEN 2
    WHEN "OP" THEN 3
    ELSE 4
END AS OrderBy
FROM
  /*Tables*/
WHERE
  /*conditions*/
ORDER BY
  OrderBy,
  /*other fields*/

【讨论】:

谢谢。很高兴知道其他人使用这个 hack/kludge!让我感觉自己是一个更好的程序员/dba。 当我开始订购时,SO 警告我 3 个答案。 别名“Sequence”真的是个好主意吗?它不会与某些 SQL 服务器上的保留字冲突吗?例如,Firebird 中有新的“CREATE SEQUENCE ...”语法。 我个人对 Firebird 并不熟悉。我使用 SQL Server 2005 的企业管理器。但如果 Sequence 不适合您,那么也可以使用 Order By。事实上,我想我会编辑回复。【参考方案3】:

将这些值添加到另一个带有数字列的表中:

Edition  Rank
NE       1
OE       2
OP       3

加入表格,并按 RANK 字段排序。

【讨论】:

没错。如果它不是永久需要或经常更改,那么 OP 可以使用临时表/表变量。【参考方案4】:

试试:

select *
from MyTable
order by
case [FIELD] 
    when 'NE' then 1
    when 'OE' then 2
    when 'OP' then 3
    when '' then 4
    else 5
end

【讨论】:

【参考方案5】:
SELECT * FROM (

SELECT 1 as Rank, R.* FROM RETAIL R WHERE MTITLE LIKE 'somethi%' AND EDITION='NE'
   UNION ALL
SELECT 2 as Rank, R.* FROM RETAIL R WHERE MTITLE LIKE 'somethi%' AND EDITION='OE'
   UNION ALL
SELECT 3 as Rank, R.* FROM RETAIL R WHERE MTITLE LIKE 'somethi%' AND EDITION='OP'
   UNION ALL (etc...)

) ORDER BY 1

【讨论】:

【参考方案6】:

试试这个:

ORDER BY FIND_IN_SET(EDITION, 'NE,OE,OP,')

【讨论】:

FIND_IN_SET() 在 SQL Server 2005 中不起作用。你能告诉我你是怎么做到的吗?我有一个杂乱无章的解决方案,但我一直在寻找更优雅的解决方案。【参考方案7】:

这个怎么样?

SELECT * 
FROM RETAIL
WHERE MTITLE LIKE 'somethi%'
ORDER BY POSITION(EDITION, ' OP OE NE') DESC

如果 substr 为空字符串,则结果为 1。 如果未找到匹配项,则结果为 0。

位置()

在 Firebird 2.1 中添加

参考: https://firebirdsql.org/refdocs/langrefupd21-intfunc-position.html

【讨论】:

【参考方案8】:
    CREATE TABLE #TMP
(
       ID INT IDENTITY(1,1),
       NAME VARCHAR(100),
)

INSERT INTO #TMP
SELECT 'ASHISH'
UNION ALL
SELECT 'CHANDAN'
UNION ALL
SELECT 'DILIP'
UNION ALL
SELECT 'ESHA'
UNION ALL
SELECT 'FIZA'
UNION ALL
SELECT 'MAHESH'
UNION ALL
SELECT 'VIPUL'
UNION ALL
SELECT 'ANIL'

-- I want to sort NAME column from value 'DILIP' then query will be as bellow

SELECT * FROM #TMP ORDER BY CASE WHEN NAME='DILIP' THEN '1' ELSE NAME END ASC

DROP TABLE #TMP

【讨论】:

创建表实际上需要对数据库的独占访问,否则迟早会有两个用户同时创建它。此外,如果网络连接中断或客户端应用程序崩溃甚至服务器崩溃 - 那么此表可能仍保留在数据库中 - 您在尝试创建它之前不会检查这种情况。【参考方案9】:
SELECT (CASE WHEN 'NE' THEN 1
    WHEN "OE" THEN 2
    WHEN "OP" THEN 3
    ELSE 4) as orden,* FROM Retail WHERE MTITLE LIKE 'somethi%' 
     AND EDITION IN ('NE', 'OE', 'OP', '') ORDER BY Orden

【讨论】:

请解释你在那里做了什么。

以上是关于按特定字段值排序 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

Sql查询按某字段值排序

sql 语句按字段指定值排序及分页

sq 语句 查询两个表 并按时间字段排序

mysql 联表查询后,将某个字段的特定值排序在最前面

SQL查询结果加入排序值的问题

sql按某个字段值顺序排序