在SQL中为Order by应用Where子句

时间:2013-01-10 08:35:01

标签: sql sql-server-2008 sorting sql-order-by where-clause

希望按照类似子句选择关键字的方式对以下数据进行排序:

表格中的数据:

EmpId EmpLotusNotes
10001 Amit B/India
20002 Bharat C/India
30003 Kyo Jun/Japan
40004 Jee Lee/China
50005 Xavier K/USA

根据特定国家/地区(日本,中国,印度,美国)提供/排序的数据:

EmpId EmpLotusNotes
30003 Kyo Jun/Japan
40004 Jee Lee/China
10001 Amit B/India
20002 Bharat C/India
50005 Xavier K/USA

注意:我无法创建另一个包含国家/地区订单或任何其他更改的表。

4 个答案:

答案 0 :(得分:4)

这应该成为一个技巧:

SELECT
   EmpId, EmpLotusNotes
FROM 
   dbo.Table
ORDER BY
   CASE 
      WHEN EmpLotusNotes LIKE '%Japan' THEN 1
      WHEN EmpLotusNotes LIKE '%China' THEN 2 
      WHEN EmpLotusNotes LIKE '%India' THEN 3
      WHEN EmpLotusNotes LIKE '%USA' THEN 4
   END

答案 1 :(得分:3)

也许:

SELECT
   EmpId, EmpLotusNotes
FROM 
   dbo.Table
ORDER BY
   CASE WHEN EmpLotusNotes LIKE '%Japan' THEN 0 ELSE 1 END,
   CASE WHEN EmpLotusNotes LIKE '%China' THEN 0 ELSE 1 END,
   CASE WHEN EmpLotusNotes LIKE '%India' THEN 0 ELSE 1 END,
   CASE WHEN EmpLotusNotes LIKE '%USA' THEN 0 ELSE 1 END

这是DEMO

答案 2 :(得分:3)

问题是该表违反了第一范式,EmpLotusNotes不应包含员工的姓名和国家/地区,可能是他们所在的国家/地区。

您应该质疑为什么不允许您清理结构和数据的原因。

请参阅https://www.google.com.au/search?q=sql+first+normal+form+atomic

答案是,如果在挑战之后仍无法规范化数据库,则为国家/地区创建查询,创建查询以将第一个表中的数据拆分为第一个正常形式,然后加入两个。

一个适用于mysql的示例如下,对于MS SQL,您将使用CHARINDEX而不是INSTR和substring而不是substr。

select employeesWithCountries.*
, countries.sort 
from (
    select empId, empLotusNotes, substr( empLotusNotes, afterStartOfDelimiter ) country from (
        select empId
        , empLotusNotes
        , INSTR( empLotusNotes, '/' ) + 1 as afterStartOfDelimiter 
        from EmployeesLotusNotes
    ) employees
) employeesWithCountries
inner join (
    SELECT 'Japan' as country, 1 as sort
    union
    SELECT 'China' as country, 2 as sort
    union
    SELECT 'India' as country, 3 as sort
    union
    SELECT 'USA' as country, 4 as sort
) countries
on employeesWithCountries.country = countries.country
order by countries.sort, employeesWithCountries.empLotusNotes

结果。

30003    Kyo Jun/Japan   Japan    1
40004    Jee Lee/China   China    2
10001    Amit B/India    India    3
20002    Bharat C/India  India    3
50005    Xavier K/USA    USA      4

答案 3 :(得分:0)

您可以使用公用表表达式首先处理原始数据,然后对处理过的数据进行过滤和/或排序。像下面的东西。 myCol中的函数可以使用任何类型的函数进行更改,甚至是CASE子句。

WITH T as 
(SELECT EmpId, EmpLotusNotes, SOMEFUNCTION(EmpLotusNotes) as myCol
 FROM Table1
)
SELECT *
FROM T 
WHERE myCol = XXX
ORDER BY myCol