SSIS - 派生列

时间:2012-09-05 17:27:30

标签: sql sql-server sql-server-2008 ssis derived-column

我有一个小问题,我是新问题所以请帮助我。

在我的项目中,我有一个文本文件,其中包含zip4zip5,我想连接两个邮政编码,但它有一个问题,在某些地方zip4为空(非空)所以当我使用

的派生列时
ISNULL(ZIP_4) ? ZIP_5 : (ZIP_5 + "-" + ZIP_4) 

表达式将返回

  

(zip5-)

其中zip4为空,我只想zip5而不是-

所以请帮助我。

2 个答案:

答案 0 :(得分:4)

尝试

ISNULL([ZIP_4]) || LEN([ZIP_4]) == 0  ? [ZIP_5] : ([ZIP_5] + "-" + [ZIP_4]) 

ISNULL([ZIP_4]) || LEN(RTRIM(LTRIM([ZIP_4]))) == 0  ? [ZIP_5] : ([ZIP_5] + "-" + [ZIP_4]) 

第二个将在检查其长度之前修剪zip_4双方。

答案 1 :(得分:0)

ANSI定义的行为是任何涉及null的操作保存对nullity(is [not] null)的显式测试都会产生null。不幸的是,SQL Server的默认行为是非标准的。所以......

在执行独立查询之前,您需要确保存储过程的以下两个设置 ,或者在连接中打开:

  • set ansi_nulls on
  • set concat_nulls on

如果在存储过程的主体中设置这些设置,则设置仅适用于该存储过程;如果为连接设置它们(通过执行set语句),它们对于在该连接上执行的所有查询都是一个(除了存储过程有自己的执行上下文)。

遗憾的是,您不能保证丢失的数据总是null而不是零字符串('') - 它使逻辑变得更简单。

无论如何,一旦你启用了正确的`null行为,就像

-- if missing data is always NULL, do this
select zip9 = t1.zip5 + coalesce( '-'+t1.zip4 , '' )
from someTable t1

-- if missing data might be nil ('') or NULL, do this
select zip9 = t1.zip5
            + coalesce(
                '-'
                + case coalesce(t1.zip4,'') when '' then null else t1.zip4 end ,
                ''
                )
from someTable t1

应该这样做。

否则,如果您不想启用正确的行为,可以执行以下操作。这也适用于标准的NULL行为。我只是不喜欢它,因为它涉及多个测试。但正如他们所说的那样TMTOWTDI

select zip9 = t1.zip5
            + case
                when t1.zip4 = ''    then ''
                when t1.zip4 is null then ''
                else '-' + t1.zip4
              end
from someTable t1