如何在某些情况下在两个字段值之间切换?
Posted
技术标签:
【中文标题】如何在某些情况下在两个字段值之间切换?【英文标题】:How to switch between two field value under some condition? 【发布时间】:2013-02-16 16:24:11 【问题描述】:这样的表格:
id doc_before doc_after
0 100
1 167 153
2 132
如果存在,我想获取doc_after
,否则获取doc_before
。
如何做到这一点?
我想要这样的结果:
0 100
1 153
2 132
【问题讨论】:
你想要这个在 sql 还是 vb/c# 中? 还有,你试过什么? 我想要sql
,但如果没有办法,我想要linq
中的某种方式
请记住表是有名字的;在您的问题中包含表名!此外,由于您说您需要跟踪数据的来源(值来自哪一列),因此应该更新问题以包含该要求。此外,作为任何与 DBMS 相关的问题的一般规则,最好指明您正在使用或感兴趣的 DBMS 版本。
@JonathanLeffler : 非常感谢您的建议,我会在接下来的问题中解决这个问题 :) :)
【参考方案1】:
SELECT id
, COALESCE(doc_after, doc_before) AS the_doc
FROM the_table
;
【讨论】:
这是一个 ANSI 函数,在 sybase 中可以有其他名称。 (在 oracle 中称为 IFNULL(), IIRC)SELECT task_code , nvl(pdf_column , db_name) AS the_doc FROM df1task ;
这对我有用,但无法确定数据来自哪个字段
为什么要关心数据来自哪些字段?这不是您最初问题的一部分,我不认为它是有用的信息。
@DanBracuk : 这对我很重要 :)【参考方案2】:
您可以使用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
【讨论】:
您可能希望将IS NOT NULL
添加到条件中以适应 NULL 值。
但是有什么方法可以知道它是来自doc_after
还是doc_before
您可以在SELECT
声明中添加另一个项目。我更新了我的答案
实际上,对于informix,您必须使用nvl(),而不是isnull()。 publib.boulder.ibm.com/infocenter/idshelp/v10/index.jsp?topic=/…
有一个语法错误: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 docitcamefrom FROM yourtable
第二个nvl
【参考方案3】:
更惯用的 CASE 用法将避免使用 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”。
【讨论】:
以上是关于如何在某些情况下在两个字段值之间切换?的主要内容,如果未能解决你的问题,请参考以下文章
如何在没有内存泄漏的情况下在 ARC 中的 UIView 之间切换?
如何在不使用   的情况下在行内元素之间添加空格 [重复]
如何在没有 SQL Server Management Studio 的情况下在 SQL Server Express LocalDB 中使用 Visual Studio 2013 创建两个表之间的关