2012-10-25 43 views
0

我知道我可以在我的編程語言中做到這一點,但我想嘗試在SQL內部做到這一點,這樣我就不必打擾任何前端代碼。有條件的字段選擇oracle

我有一個表有三個名稱字段 - 名稱1,名稱2,名稱3。

隨機可能存在任何或所有這些字段中的值。

我想查詢將返回三個字段使得

它會檢查1,名稱2,名稱3 - 這曾經第一個字段的值爲進入FIRST_NAME, 其有史以來第二個字段的值爲進入SECOND_NAME,然後third_field。

我可以輕鬆編寫CASE-END語句來填充first_name,但是當我開始編寫second_name的邏輯時,它變得更加複雜。

的SQL:

SELECT 
    CASE 
    WHEN NAME1 IS NOT NULL 
    THEN NAME1 
    ELSE 
     CASE 
     WHEN NAME2 IS NOT NULL 
     THEN NAME2 
     ELSE 
      CASE 
      WHEN NAME3 IS NOT NULL 
      THEN NAME1 
      ELSE '' 
      END 
     END 
    END FIRST_NAME 
    FROM TABLE_NAME 

現在,我該如何處理SECOND_NAME和third_name?或者他們是一個更簡單的方法?

任何幫助表示讚賞..

回答

4

你可能會做這樣的事情

SELECT coalesce(name1, name2, name3) first_name, 
     (case when name1 is not null 
      then nvl(name2, name3) 
      when name2 is not null 
      then name3 
      else null 
     end) second_name, 
     (case when name1 is not null and 
        name2 is not null 
      then name3 
      else null 
     end) third_name 
    FROM your_table 

但是要做到這一點的願望似乎表明你有一個需要解決的一個數據模型的問題。如果您有三列顯然都存儲相同的數據,表格未正確標準化。如果您將名稱存儲在與現有表格具有1:n關係的單獨表格中,這將是一個更好的數據模型(以及更簡單的查詢)。

+0

你,先生,真棒!這個漂亮的作品正是我需要的!我知道你對錶結構和內容的意義 - 但它的舊式系統我不能修改(也是我沒有觸及前端代碼並在SQL內處理這個問題的原因) 再次感謝,我希望我可以多次讚揚你的答案! *快樂* –