1

我正在研究一个癌症数据库,我有一列是患者局部复发的日期(如果他们有的话),另一列是患者远处复发的日期(如果他们有的话)。我想创建另一个包含 FIRST 重复日期的列,无论它是本地的还是远程的。我不确定如何进行,因为有些患者只有本地或只有远程,因此许多字段是“NULL”。这是我想要做的一个例子:

Date_Local     Date_Distant     Date_Any
2010-08-01     2009-05-25       2009-05-25
NULL           2001-01-07       2001-01-07
1999-12-12     NULL             1999-12-12
NULL           NULL             NULL
4

2 回答 2

0

假设您已经使用语句添加了列,您将使用查询中的语句ALTER TABLE填充它,例如:CASEUPDATE

ALTER TABLE cancertable ADD Date_Any DATE AFTER Date_Distant;

UPDATE cancertable SET Date_Any = 
  CASE
    WHEN Date_Local IS NOT NULL AND Date_Local <= Date_Distant THEN Date_Local
    WHEN Date_Distant IS NOT NULL AND Date_Distant < Date_Local THEN Date_Distant
    ELSE NULL
  END

上面的语句将更新所有行,因为它没有WHERE子句。在执行 之前UPDATE,使用 a 对其进行测试SELECT以确保它看起来像您期望的那样:

SELECT *,
  CASE
    WHEN Date_Local IS NOT NULL AND Date_Local <= Date_Distant THEN Date_Local
    WHEN Date_Distant IS NOT NULL AND Date_Distant < Date_Local THEN Date_Distant
    ELSE NULL
  END AS Date_Any
FROM cancertable

但是,请考虑您是否真的需要添加另一列。根据您打算查询的频率,您可能只使用SELECT上面的语句创建一个视图,因此该Date_Any值将是“实时”的。

于 2012-05-10T02:35:19.500 回答
0

添加具有此计算日期的新列可能不是最好的主意。因为您将根据快照(时间点)计算值。但是,如果任何一个源日期发生变化,则计算值可能会变为无效。

如果您决定添加这个额外的计算列,那么我强烈建议您通过插入和更新触发器使其保持最新。但是在你的应用层处理这个逻辑会好得多。您可以使用以下查询轻松查询推断的重复日期:

SELECT LEAST(COALESCE(Date_Local, Date_Distant), COALESCE(Date_Distant, Date_Local))
FROM TableNameHere WHERE where-clause-here;
于 2012-05-10T02:52:54.707 回答