希望按照类似子句选择关键字的方式对以下数据进行排序:
表格中的数据:
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
注意:我无法创建另一个包含国家/地区订单或任何其他更改的表。
答案 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