2013-02-16 60 views
1

有了這樣的表:如何在某些情況下在兩個字段值之間切換?

id doc_before doc_after 
0  100 
1  167   153 
2  132  

我想要得到的doc_after是否存在其他獲得doc_before

如何做到這一點?

我想是這樣的結果:

0 100 
1 153 
2 132 
+0

你想在sql或vb/c#中使用這個嗎? – 2013-02-16 16:24:55

+0

另外,你有什麼嘗試? – 2013-02-16 16:25:32

+0

我想'sql',但是如果沒有辦法,我想''linq'中的某種方式 – 2013-02-16 16:26:15

回答

1

您可以使用CASE聲明。這是受支持的Informix語法。

SELECT ID, CASE WHEN nvl(doc_after,'') <> '' THEN doc_after ELSE doc_before END AS doc 
, CASE WHEN nvl(doc_after) <> '' THEN 'doc_after' ELSE 'doc_before' END AS camefrom 
FROM yourtable 
+1

您可能需要將'IS NOT NULL'添加到條件以滿足NULL值。 – 2013-02-16 16:30:08

+0

非常感謝。我節省了我的時間:D – 2013-02-16 16:35:36

+0

,但有什麼方法可以知道它是來自'doc_after'還是'doc_before' – 2013-02-16 16:38:41

2
SELECT id 
    , COALESCE(doc_after, doc_before) AS the_doc 
FROM the_table 
    ; 
+0

非常感謝,但我在'informix'中找不到'COALESCE' – 2013-02-16 16:40:40

+1

它是一個ANSI函數,可以在sybase中有其他名稱。 (在Oracle它被稱爲IFNULL(),IIRC) – wildplasser 2013-02-16 16:44:38

+0

'選擇task_code ,NVL(pdf_column,DB_NAME)AS the_doc FROM df1task ;' 這工作我,但不能確定數據來自哪個領域,從 – 2013-02-16 17:02:11

1

更慣用的使用的情況下會避免使用NVL:

SELECT ID, 
     CASE WHEN doc_after IS NULL THEN doc_before ELSE doc_after END AS doc_number, 
     CASE WHEN doc_after IS NULL THEN 'B'  ELSE 'A'  END AS doc_source 
    FROM AnonymousTable; 

顯然編碼 'A' 爲 '後' 和 'B' '前' 是可以改變以滿足您的需求。

相關問題