地址行的SQL函数
嗨,我想扩展一个连接地址行1和地址行2的内置函数。我试图将这个逻辑扩展到地址行1、2、3和4。下面是内置函数的示例。三行之后,我的大脑停止了工作。如果你们能在这方面帮助我,我将不胜感激。谢谢地址行的SQL函数,sql,function,concatenation,Sql,Function,Concatenation,嗨,我想扩展一个连接地址行1和地址行2的内置函数。我试图将这个逻辑扩展到地址行1、2、3和4。下面是内置函数的示例。三行之后,我的大脑停止了工作。如果你们能在这方面帮助我,我将不胜感激。谢谢 CREATE function [dbo].[UFN_CONCATENATEADDRESSLINES] ( @ADDRESSLINE1 nvarchar(max), @ADDRESSLINE2 nvarchar(max) ) returns nvarchar(max) as begin
CREATE function [dbo].[UFN_CONCATENATEADDRESSLINES]
(
@ADDRESSLINE1 nvarchar(max),
@ADDRESSLINE2 nvarchar(max)
)
returns nvarchar(max)
as
begin
declare @ADDRESSBLOCK nvarchar(max);
set @ADDRESSBLOCK =
case when (@ADDRESSLINE1 is null and @ADDRESSLINE2 is null)
then null
when (@ADDRESSLINE1 is not null and @ADDRESSLINE2 is null)
then
case when len(ltrim(rtrim(@ADDRESSLINE1))) > 0
then @ADDRESSLINE1
else null end
when (@ADDRESSLINE1 is null and @ADDRESSLINE2 is not null)
then
case when len(ltrim(rtrim(@ADDRESSLINE2))) > 0
then @ADDRESSLINE2
else null end
else -- (@ADDRESSLINE1 is not null and @ADDRESSLINE2 is not null)
case when len(ltrim(rtrim(@ADDRESSLINE1))) > 0 and len(ltrim(rtrim(@ADDRESSLINE2))) = 0
then @ADDRESSLINE1
when len(ltrim(rtrim(@ADDRESSLINE1))) = 0 and len(ltrim(rtrim(@ADDRESSLINE2))) > 0
then @ADDRESSLINE2
else (@ADDRESSLINE1 + char(13) + char(10) + @ADDRESSLINE2) end
end;
return @ADDRESSBLOCK;
end
我为新的扩展函数构建的具有操作的矩阵如下所示
Add1 |Add2 | Add3 |Add4 |Action
--------------------------------------------------------------------------------
Filled |Filled |Filled |Filled |Bring all columns as address block
Filled |Filled |Filled |NULL |Bring first 3 as address block
Filled |Filled |NULL |NULL |Bring first 2 as address block
Filled |NULL |NULL |NULL |Bring only 1 as address block
NULL |NULL |NULL |NULL |Mark it as null
NULL |NULL |NULL |Filled |Move 4 to 1
NULL |NULL |Filled |Filled |Move 3 and 4 to 1 and 2 respectively
NULL |Filled |Filled |Filled |Move 2 to 1, 3 to 2 and 4 to 3
Filled |Filled |NULL |Filled |Move 4 to 3
Filled |NULL |NULL |Filled |Move 4 to 2
Filled |NULL |Filled |Filled |Move 3 and 4 to 2 and 3
我认为这个函数满足您的需要。不过,它以统一的方式执行此操作,而不是遵循表中某些行的稍微奇怪的规范:
create function dbo.CompressAddress (
@AddressLine1 nvarchar(max),
@AddressLine2 nvarchar(max),
@AddressLine3 nvarchar(max),
@AddressLine4 nvarchar(max)
)
returns nvarchar(max)
as
begin
return
NULLIF(COALESCE(CASE WHEN LEN(RTRIM(@AddressLine1))>0 THEN
LTRIM(RTRIM(@AddressLine1)) END + char(13) + char(10),'') +
COALESCE(CASE WHEN LEN(RTRIM(@AddressLine2))>0 THEN
LTRIM(RTRIM(@AddressLine2)) END + char(13) + char(10),'') +
COALESCE(CASE WHEN LEN(RTRIM(@AddressLine3))>0 THEN
LTRIM(RTRIM(@AddressLine3)) END + char(13) + char(10),'') +
COALESCE(CASE WHEN LEN(RTRIM(@AddressLine4))>0 THEN
LTRIM(RTRIM(@AddressLine4)) END,''),'')
end
go
不确定我发布的表格为何显示在此处的行中。:-)您正在使用哪个数据库?不同的数据库支持不同的解决方案Hi Allan,我使用的是SQL server 2008 R2表中的两行看起来有点可疑-真的存在某些情况吗(只有
Add4
filled,以及1,2和4
filled,您确实想删除一些数据吗?您好,谢谢您发现了这一点。对于这一行filled | filled | NULL | filled | Move 4到2,操作应该移动4到3。