2013-01-10 76 views
1

想子句以下列數據的方式允許在關鍵字的選擇基於類似條款的順序進行排序:應用凡在SQL

數據表:

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

SQL Server 2008 R2 R2 – psam

+0

請發佈您的SQL SELECT子句,我們不能幫助您。如果你可以創建一個[SQLFiddle](http://sqlfiddle.com/),那真是太棒了...... – ppeterka

+0

這個國家是在一個單獨的列還是EmpLotusNotes列的一部分嗎? – Jacco

回答

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 
+1

輝煌!謝謝! – psam

+0

不客氣:-) –

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

0

您可以使用公用表表達式先處理原始數據,做你的過濾和/或排序在處理數據後。像下面的東西。 myCol中的函數可以使用任何函數進行更改,即使是CASE子句。

WITH T as 
(SELECT EmpId, EmpLotusNotes, SOMEFUNCTION(EmpLotusNotes) as myCol 
FROM Table1 
) 
SELECT * 
FROM T 
WHERE myCol = XXX 
ORDER BY myCol 
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