2016-11-02 94 views
2

我有我的SQL查詢問題,不知道如何解決這個問題:的Oracle SQL - CASE WHEN THEN ELSE忽略ELSE部分

輸出表組成。

1. SERIALNR VARCHAR(26) NOT NULL 
2. LP_BASIC VARCHAR(20) NOT NULL 
3. LP_NEW  VARCHAR(20) 
4. SCORE  NUMBER(20) NOT NULL 
5. CURRENT_LP VARCHAR(20) 

該查詢本身運行良好,並且不包含錯誤。

LP_BASIC柱總是充滿而LP_NEW是一個可選字段。 CURRENT_LP應始終顯示LP_NEW(如果不是空的)其他LP_BASIC(它永遠不會爲空)。

問題是,「ELSE f.LP_BASIC」 - 部分不起作用。 它應該返回LP_BASIC值,如果沒有LP_NEW記錄被發現,而是它只返回一個空場。

SELECT 
    f.SERIALNR, 
    f.LP_BASIC, 
    f.LP_NEW, 
    f.SCORE, 
    CASE 
    WHEN 
     f.LP_NEW 
     IS NOT NULL 
     THEN 
      f.LP_NEW 
    ELSE 
     f.LP_BASIC 
    END 
AS CURRENT_LP 
FROM (
     SELECT 
      SERIALNR, 
      MAX(SCORE) MAX_ID 
     FROM 
      EAPS.PS_TC_SM 
     GROUP BY 
      SERIALNR 
    ) x 
INNER JOIN 
    EAPS.PS_TC_SM f 
ON 
    f.SERIALNR= 
    x.SERIALNR 
AND 
    f.SCORE = 
    x.MAX_ID 

任何幫助apreciated。

預先感謝您。

Rob。

UPDATE(解決)

的LP_NEW列是不爲空,這又有一個空格字符,所以 「IS NULL」 沒有工作。

+0

請張貼一些示例數據,需要的結果和你正在從查詢 – Aleksej

+0

越來越這是不是可以更簡單閱讀? 'coalesce(f.LP_NEW,f.LP_BASIC)' – Kritner

+1

@Kritner'Coalesce'更好。 'Nvl'對兩個值進行比較,只要找到一個值,'coalesce'就會停止。 – JohnHC

回答

2

(這是太長了評論,所以張貼的答案)

正如評論已經提到的,你CASE說法是完全沒有問題;你應該重新檢查你的輸入數據。

示例,演示了用假數據的方法的正確性:

with v_input(serialnr, lp_basic, lp_new) as (
    select 
    level, 
    'basic_' || to_char(level), 
    (case when mod(level, 2) = 0 then 'new_' || to_char(level) else null end) 
    from dual 
    connect by level <= 10) 
SELECT 
    f.SERIALNR, 
    f.LP_BASIC, 
    f.LP_NEW, 
    CASE 
    WHEN 
     f.LP_NEW 
     IS NOT NULL 
     THEN 
      f.LP_NEW 
    ELSE 
     f.LP_BASIC 
    END 
AS CURRENT_LP 
FROM v_input f 
+0

謝謝。所有LP_NEW記錄中都有一個空格字符,它們阻止了CASE語句的工作,所以我將IS NULL更改爲='',現在整個事情按預期工作。我有點新的SQL,並沒有想到這可能會發生。 – Robama