地址行的SQL函数

地址行的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

嗨,我想扩展一个连接地址行1和地址行2的内置函数。我试图将这个逻辑扩展到地址行1、2、3和4。下面是内置函数的示例。三行之后,我的大脑停止了工作。如果你们能在这方面帮助我,我将不胜感激。谢谢

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。