1

想要按照基于like子句的关键字选择顺序允许的方式对以下数据进行排序:

表中数据:

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

4 回答 4

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
于 2013-01-10T08:46:08.620 回答
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

这是演示

于 2013-01-10T08:41:03.620 回答
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
于 2013-01-10T10:47:40.730 回答
1

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

WITH T as 
(SELECT EmpId, EmpLotusNotes, SOMEFUNCTION(EmpLotusNotes) as myCol
 FROM Table1
)
SELECT *
FROM T 
WHERE myCol = XXX
ORDER BY myCol
于 2013-01-10T08:46:05.280 回答