我有一个小问题,我是新问题所以请帮助我。
在我的项目中,我有一个文本文件,其中包含zip4
和zip5
,我想连接两个邮政编码,但它有一个问题,在某些地方zip4为空(非空)所以当我使用
ISNULL(ZIP_4) ? ZIP_5 : (ZIP_5 + "-" + ZIP_4)
表达式将返回
(zip5-)
其中zip4
为空,我只想zip5
而不是-
。
所以请帮助我。
答案 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