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

この計算された日付を使用して新しい列を追加することは、最善のアイデアではない可能性があります。スナップショット (特定の時点) に基づいて値を計算するためです。ただし、ソース日付のいずれかが変更されると、計算された値が無効になる可能性があります。

この余分な計算列を追加する場合は、挿入トリガーと更新トリガーを使用して最新の状態に保つことを強くお勧めします。ただし、アプリケーション層でこのロジックを処理する方がはるかに優れています。次のクエリを使用して、推定される繰り返しの日付を簡単にクエリできます。

SELECT LEAST(COALESCE(Date_Local, Date_Distant), COALESCE(Date_Distant, Date_Local))
FROM TableNameHere WHERE where-clause-here;
于 2012-05-10T02:52:54.707 に答える
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でテストして、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 に答える