我有一个小问题,我是新手,所以请帮助我。
在我的项目中,我有一个具有zip4
和的文本文件zip5
,我想连接两个邮政编码,但它有一个问题,在某些地方 zip4 是空白的(不是空的)所以当我使用派生列时
ISNULL(ZIP_4) ? ZIP_5 : (ZIP_5 + "-" + ZIP_4)
表达式它将返回
(zip5-)
wherezip4
是空白的,我只想要zip5
没有-
.
所以请帮助我。
我有一个小问题,我是新手,所以请帮助我。
在我的项目中,我有一个具有zip4
和的文本文件zip5
,我想连接两个邮政编码,但它有一个问题,在某些地方 zip4 是空白的(不是空的)所以当我使用派生列时
ISNULL(ZIP_4) ? ZIP_5 : (ZIP_5 + "-" + ZIP_4)
表达式它将返回
(zip5-)
wherezip4
是空白的,我只想要zip5
没有-
.
所以请帮助我。
尝试
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
两侧。
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