在派生列中嵌套 IF ELSE
Nested IF ELSE in a derived column
我有以下逻辑将日期存储在 BI_StartDate 中,如下所示:
- 如果
UpdatedDate
不为空则 BI_StartDate=UpddatedDate
- ELSE
BI_StartDate
取 EntryDate
值,如果 EntryDate
为空
然后 BI_StartDate=CreatedDate
- 如果
CreatedDate
为 NULL,则 BI_StartDate=GetDATE()
我正在使用派生列,如下所示:
ISNULL(UpdatedDateODS) ? EntryDateODS : (ISNULL(EntryDateODS) ? CreatedDateODS :
(ISNULL(CreatedDateODS) ? GETDATE() ))
我收到此错误:
The expression "ISNULL(UpdatedDateODS) ? EntryDateODS :
(ISNULL(EntryDateODS) ? CreatedDateODS :(ISNULL(CreatedDateODS) ?
GETDATE() ))" on "Derived Column.Outputs[Derived Column
Output].Columns[Derived Column 1]" is not valid.
您正在查找第一个非空值,它是 SSIS 数据流(派生列)中不存在的合并。
我建议一个非常简单的脚本组件:
Row.BIStartDate = Row.UpdateDate ?? Row.EntryDate ?? Row.CreatedDate ?? DateTime.Now;
这是输入列屏幕:
这是输入和输出:
然后将以上代码添加到行处理部分:
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
/*
* Add your code here
*/
Row.BIStartDate = Row.UpdateDate ?? Row.EntryDate ?? Row.CreatedDate ?? DateTime.Now;
}
从语法的角度来看,嵌套的if-else条件写得不好,因为你必须确保所有可能的输出都应该有相同的数据类型,你也没有'提到最后一个"else"条件:
ISNULL(UpdatedDateODS) ? EntryDateODS : (ISNULL(EntryDateODS) ? CreatedDateODS :
(ISNULL(CreatedDateODS) ? GETDATE() : **<missing>** ))
从逻辑角度,如果ISNULL(UpdatedDateODS)
为真,你的表达式可能会抛出异常,因为你正在使用EntryDateODS
列,而你应该检查EntryDateODS
在使用之前不为null,我建议表达式如下:
ISNULL(UpdatedDateODS) ? UpdatedDateODS : (ISNULL(EntryDateODS) ? EntryDateODS :
(ISNULL(CreatedDateODS) ? CreatedDateODS : GETDATE() ))
如上所述,如果 UpdatedDateODS
, EntryDateODS
, CreatedDateODS
和 GETDATE()
没有相同的数据类型 那么你应该转换为统一的数据类型,例如:
ISNULL(UpdatedDateODS) ? (DT_DATE)UpdatedDateODS : (ISNULL(EntryDateODS) ? (DT_DATE)EntryDateODS :
(ISNULL(CreatedDateODS) ? (DT_DATE)CreatedDateODS : (DT_DATE)GETDATE() ))
我有以下逻辑将日期存储在 BI_StartDate 中,如下所示:
- 如果
UpdatedDate
不为空则BI_StartDate=UpddatedDate
- ELSE
BI_StartDate
取EntryDate
值,如果EntryDate
为空 然后BI_StartDate=CreatedDate
- 如果
CreatedDate
为 NULL,则BI_StartDate=GetDATE()
我正在使用派生列,如下所示:
ISNULL(UpdatedDateODS) ? EntryDateODS : (ISNULL(EntryDateODS) ? CreatedDateODS :
(ISNULL(CreatedDateODS) ? GETDATE() ))
我收到此错误:
The expression "ISNULL(UpdatedDateODS) ? EntryDateODS : (ISNULL(EntryDateODS) ? CreatedDateODS :(ISNULL(CreatedDateODS) ? GETDATE() ))" on "Derived Column.Outputs[Derived Column Output].Columns[Derived Column 1]" is not valid.
您正在查找第一个非空值,它是 SSIS 数据流(派生列)中不存在的合并。
我建议一个非常简单的脚本组件:
Row.BIStartDate = Row.UpdateDate ?? Row.EntryDate ?? Row.CreatedDate ?? DateTime.Now;
这是输入列屏幕:
这是输入和输出:
然后将以上代码添加到行处理部分:
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
/*
* Add your code here
*/
Row.BIStartDate = Row.UpdateDate ?? Row.EntryDate ?? Row.CreatedDate ?? DateTime.Now;
}
从语法的角度来看,嵌套的if-else条件写得不好,因为你必须确保所有可能的输出都应该有相同的数据类型,你也没有'提到最后一个"else"条件:
ISNULL(UpdatedDateODS) ? EntryDateODS : (ISNULL(EntryDateODS) ? CreatedDateODS :
(ISNULL(CreatedDateODS) ? GETDATE() : **<missing>** ))
从逻辑角度,如果ISNULL(UpdatedDateODS)
为真,你的表达式可能会抛出异常,因为你正在使用EntryDateODS
列,而你应该检查EntryDateODS
在使用之前不为null,我建议表达式如下:
ISNULL(UpdatedDateODS) ? UpdatedDateODS : (ISNULL(EntryDateODS) ? EntryDateODS :
(ISNULL(CreatedDateODS) ? CreatedDateODS : GETDATE() ))
如上所述,如果 UpdatedDateODS
, EntryDateODS
, CreatedDateODS
和 GETDATE()
没有相同的数据类型 那么你应该转换为统一的数据类型,例如:
ISNULL(UpdatedDateODS) ? (DT_DATE)UpdatedDateODS : (ISNULL(EntryDateODS) ? (DT_DATE)EntryDateODS :
(ISNULL(CreatedDateODS) ? (DT_DATE)CreatedDateODS : (DT_DATE)GETDATE() ))