4

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

在我的项目中,我有一个具有zip4和的文本文件zip5,我想连接两个邮政编码,但它有一个问题,在某些地方 zip4 是空白的(不是空的)所以当我使用派生列时

ISNULL(ZIP_4) ? ZIP_5 : (ZIP_5 + "-" + ZIP_4) 

表达式它将返回

(zip5-)

wherezip4是空白的,我只想要zip5没有-.

所以请帮助我。

4

2 回答 2

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两侧。

于 2012-09-05T17:39:17.380 回答
0

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

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

  • set ansi_nulls on
  • set concat_nulls on

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

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

无论如何,一旦你启用了适当的 `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
于 2012-09-05T17:50:52.090 回答