2012-12-03 94 views
2

我有以下Oracle SQL查詢。給定名稱和姓氏後,它會按照任意順序查找帶有一個名稱和另一個的首字母的所有記錄。我創建了score列,以便將可能的匹配放在結果集的頂部。添加CASE語句的結果

SELECT 
    surname, 
    givenname, 
    (CASE WHEN surname = 'Smith' THEN 2 ELSE 0) 
    + (CASE WHEN givenname = 'John' THEN 1 ELSE 0) 
    AS score 
FROM person 
WHERE (surname = 'Smith' AND givenname LIKE 'J%') 
    OR (surname LIKE 'S%' AND givenname = 'John') 
    OR (surname = 'John' AND givenname LIKE 'S%') 
    OR (surname LIKE 'J%' AND givenname = 'Smith') 
ORDER BY 
    score DESC, 
    surname ASC, 
    givenname ASC; 

問題是score是在+的位置給了一個錯誤。該IDE報告:

Syntax error, expected:
/
*
|

和執行報告:

SQL Error: ORA-00905: missing keyword

我在做什麼錯?有沒有更好的方法來計算分數?

回答

2

你缺少你的CASE報表END

SELECT 
    surname, 
    givenname, 
    (CASE WHEN surname = 'Smith' THEN 2 ELSE 0 END) -- < add END 
    + (CASE WHEN givenname = 'John' THEN 1 ELSE 0 END) -- < add END 
    AS score 
FROM person 
WHERE (surname = 'Smith' AND givenname LIKE 'J%') 
    OR (surname LIKE 'S%' AND givenname = 'John') 
    OR (surname = 'John' AND givenname LIKE 'S%') 
    OR (surname LIKE 'J%' AND givenname = 'Smith') 
ORDER BY 
    score DESC, 
    surname ASC, 
    givenname ASC; 
+0

+1。這是一個常見的疏忽。 –

+0

Bah!它沒有暗示的一件事從我的陳述中遺漏了。謝謝! –