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を参照してください

チャレンジ後もデータベースを正規化できない場合の答えは、国のクエリを作成し、最初のテーブルのデータを最初の正規形に分割するクエリを作成してから、2 つを結合することです。

mysql で機能する例を以下に示します。MS SQL では、INSTR の代わりに CHARINDEX を使用し、substr の代わりに substring を使用します。

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 に答える