2013-02-16 58 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' '前' 是可以改变以满足您的需求。

相关问题