如何设置邮寄地址的格式,以便始终将所有非空行都推到顶部?也就是说,我想将地址从下面的结构转换为邮寄地址。
结构如下:
[Line1] [varchar](50) NULL,
[Line2] [varchar](50) NULL,
[Line3] [varchar](50) NULL,
[City] [varchar](50) NULL,
[State] [varchar] (2) NULL,
[PostalCode] [varchar](50) NULL,
以下是一些示例数据:
Line1=
Line2=123 Some Address
Line3=
City=Royal Oak
State=MI
ZIP=45673-2312
结果如下所示 (应返回4个不同的字段) :
MailAddress1=123 Some Address
MailAddress2=ROYAL OAK MI 45673-2312
MailAddress3=
MailAddress4=
我正在使用SQL Server 2005。
有人在我们公司写了这个逻辑,看起来似乎很复杂(注意:这不是整个SELECT语句):
,CASE
WHEN eai.Line1 IS NULL OR eai.Line1 = '' THEN
CASE
WHEN eai.Line2 IS NULL OR eai.Line2 = '' THEN
CASE
WHEN eai.Line3 IS NULL OR eai.Line3 = '' THEN ISNULL(LTRIM(RTRIM(eai.City)),'') + ' ' + ISNULL(LTRIM(RTRIM(eai.RegionCode)),'') + ' ' + ISNULL(LTRIM(RTRIM(eai.PostalCode)),'')
ELSE eai.Line3
END
ELSE eai.Line2
END
ELSE eai.Line1
END
,CASE
WHEN eai.Line1 IS NULL OR eai.Line1 = '' THEN
CASE
WHEN eai.Line3 IS NULL OR eai.Line3 = '' THEN ISNULL(LTRIM(RTRIM(eai.City)),'') + ' ' + ISNULL(LTRIM(RTRIM(eai.RegionCode)),'') + ' ' + ISNULL(LTRIM(RTRIM(eai.PostalCode)),'')
ELSE eai.Line3
END
ELSE
CASE
WHEN eai.Line2 IS NULL OR eai.Line2 = '' THEN
CASE
WHEN eai.Line3 IS NULL OR eai.Line3 = '' THEN ISNULL(LTRIM(RTRIM(eai.City)),'') + ' ' + ISNULL(LTRIM(RTRIM(eai.RegionCode)),'') + ' ' + ISNULL(LTRIM(RTRIM(eai.PostalCode)),'')
ELSE eai.Line3
END
ELSE eai.Line2
END
END
,CASE
WHEN eai.Line1 IS NULL OR eai.Line1 = '' THEN
CASE
WHEN eai.Line2 IS NULL OR eai.Line2 = '' THEN NULL
ELSE
CASE
WHEN eai.Line3 IS NULL OR eai.Line3 = '' THEN NULL
ELSE ISNULL(LTRIM(RTRIM(eai.City)),'') + ' ' + ISNULL(LTRIM(RTRIM(eai.RegionCode)),'') + ' ' + ISNULL(LTRIM(RTRIM(eai.PostalCode)),'')
END
END
ELSE
CASE
WHEN eai.Line2 IS NULL OR eai.Line2 = '' THEN
CASE
WHEN eai.Line3 IS NULL OR eai.Line3 = '' THEN NULL
ELSE ISNULL(LTRIM(RTRIM(eai.City)),'') + ' ' + ISNULL(LTRIM(RTRIM(eai.RegionCode)),'') + ' ' + ISNULL(LTRIM(RTRIM(eai.PostalCode)),'')
END
ELSE
CASE
WHEN eai.Line3 IS NULL OR eai.Line3 = '' THEN ISNULL(LTRIM(RTRIM(eai.City)),'') + ' ' + ISNULL(LTRIM(RTRIM(eai.RegionCode)),'') + ' ' + ISNULL(LTRIM(RTRIM(eai.PostalCode)),'')
ELSE eai.Line3
END
END
END
,CASE WHEN eai.Line2 IS NOT NULL AND eai.Line2 <> '' AND eai.Line3 IS NOT NULL AND eai.Line3 <> '' THEN eai.City + ' ' + eai.RegionCode + ' ' + eai.PostalCode ELSE NULL END
这样做的方法是使用UNPIVOT。解决方法如下:
With AddrTable as (
Select AddrFld, MailAddr From (
Select Cast(ISNULL([Line1], '') as Varchar(102)) as [A1],
Cast(ISNULL([Line2], '') as Varchar(102)) as [A2],
Cast(ISNULL([Line3], '') as Varchar(102)) as [A3],
Cast(ISNULL(LTRIM(RTRIM(City)),'') + ' ' + ISNULL(LTRIM(RTRIM(RegionCode)),'') + ' ' + ISNULL(LTRIM(RTRIM(PostalCode)),'') as Varchar(102)) as A4
From TableName Where UniqueID=@UniqueID) p
Unpivot (MailAddr For AddrFld in ([A1], [A2], [A3], [A4])) as unpvt)
Select Row_Number() over (Order by (Case Len(MailAddr) When 0 then 1 else 0 end), AddrFld) as RN,
MailAddr From AddrTable
Order By RN
这是输出:
Address1
Westby WI 55555
-empty line-
-empty line-
请注意,我必须使用“
Varchar(102)”作为字段长度(unpivot要求所有字段都相同),因为您的城市/地区/邮政总计最多可以包含102个字符。另外,请注意,“ @
UniqueID”是您需要其地址的记录的标识符。这将返回四个总是4 行 包含您需要为您的地址中的数据。
更新: 如果需要将其作为一组四 列 而不是四行返回,则只需将其放入视图中,然后使用 Pivot
查询该视图。我在此处包括该视图是出于完整性的考虑,因为在创建视图时我不得不对上述内容进行一些更改,因此包括了uniqueID字段,并且未进行任何排序(该排序已在查询中完成):
Create View AddressRows AS
With AddrTable as (
Select UniqueID, AddrFld, MailAddr From (
Select UniqueID,
Cast(ISNULL([Line1], '') as Varchar(102)) as [A1],
Cast(ISNULL([Line2], '') as Varchar(102)) as [A2],
Cast(ISNULL([Line3], '') as Varchar(102)) as [A3],
Cast(ISNULL(LTRIM(RTRIM(City)),'') + ' ' + ISNULL(LTRIM(RTRIM(RegionCode)),'') + ' ' + ISNULL(LTRIM(RTRIM(PostalCode)),'') as Varchar(102)) as A4
From TableName Where UniqueID=@UniqueID) p
Unpivot (MailAddr For AddrFld in ([A1], [A2], [A3], [A4])) as unpvt)
Select UniqueID,
Row_Number() over (Order by (Case Len(MailAddr) When 0 then 1 else 0 end), AddrFld) as RN,
MailAddr From AddrTable
然后,当您想拉出匹配的“行”时,请使用此SQL将其回退(注意,我正在使用UniqueID再次查询):
Select [Addr1], [Addr2], [Addr3], [Addr4] From (
Select Top 4 'Addr' + Cast(Row_Number() over (Order by RN) as Varchar(12)) as AddrCol, -- "Top 4" needed so we can sneak the "Order By" in
MailAddr
From AddressRows Where UniqueID=@UniqueID
) p PIVOT (Max([MailAddr]) for AddrCol in ([Addr1], [Addr2], [Addr3], [Addr4])
) as pvt
这将返回:
Addr1 Addr2 Addr3 Addr4
-------------- ------------------ ------------- ------------------
Address1 Westby WI 54667
问题内容: 今天,我遇到了一个有趣的SQL问题,尽管我想出了一个行之有效的解决方案,但我怀疑这是最佳还是最有效的答案。在这里,我请专家- 帮助我学习一些知识并改善查询条件!RDBMS是SQL Server 2008 R2,查询是SSRS报告的一部分,该报告将针对约100,000行运行。 本质上,我有一个ID列表,该ID可能具有多个与之关联的值,这些值是Yes,No或其他字符串。对于ID x,如果任
问题内容: 我在Linux上的Apache和Sendmail中使用PHP。我使用PHP 函数。电子邮件已发送,但信封带有in (例如nobody@conniptin.internal),并且某些远程邮件服务器拒绝了该电子邮件,因为该域不存在(显然)。使用可以强制它更改信封吗? 编辑:如果我在()函数的第四个字段中添加标题,则会更改消息正文标题中的字段,并且不会更改信封。 我可以通过生成sendma
问题内容: 我知道,如果我在某个从函数某处调用的函数内,那么此返回地址将压入堆栈。 在上面的代码中,当foo函数处于活动状态时,我将获取堆栈中第一个推送的局部变量的地址。我如何访问在此变量堆栈之前的某个地方返回的返回地址(主要称为foo)?该位置是否固定并且可以相对于第一个局部变量访问?我该如何修改? 编辑:我的环境是带有gcc编译器的x86处理器上的Ubuntu 9.04。 问题答案: 有一个内
问题内容: 如何动态更改JAXWS客户端使用的地址?该客户端是由wsimport生成的。 问题答案: 使用Apache CXF解决了该问题。 仅用两行代码!这是代码段:
我有一个托管在Git存储中的项目(现在更名为比特桶服务器)。它是用詹金斯构建的。现在我在本地安装Git时打错了。比如@ab.com而不是@abc.com 每次构建后,詹金斯都会发送电子邮件通知,它会从Git提交中获取我不正确的电子邮件地址,并尝试发送它。 即使我在本地Git中更改了电子邮件地址,我仍然看到詹金斯将电子邮件发送到旧的错误地址。 我该怎么解决这个问题?
对于简单的Java邮件,我试图处理一种有一定自由度的分隔电子邮件地址格式。请注意,我并没有特别验证,只是从地址列表中获取地址。对于这个用例,可以假设地址是有效的。 以下是有效输入的示例: 因此,有两种基本形式“name@domain.com”和“乔·西帕克”,它们可以出现在逗号/分号分隔的字符串中,忽略空格填充。问题是名称可以包含分隔符作为有效字符。 以下数组显示了所需的数据(尾随空格或分隔符不会