【发布时间】:2010-12-11 05:39:18
【问题描述】:
我想将地址(Line1、Line2、Line3、City、State、ZIP)转换为没有空行且连接了 City、State 和 ZIP 的邮寄地址(Addr1、Addr2、Addr3、Addr4)一起在一条线上。有一个函数来做到这一点会非常好。
即
第 1 行=
Line2=123 某处
第 3 行=
城市=底特律
状态=MI
邮编=48000
这是传入地址的表结构:
IF OBJECT_ID('tempdb..#Employee') IS NOT NULL DROP TABLE #Employee
CREATE TABLE #Employee (Line1 VARCHAR(30), Line2 VARCHAR(30), Line3 VARCHAR(30),
City VARCHAR(17), State VARCHAR(2), ZIP VARCHAR(10))
GO
INSERT #Employee VALUES ('', '123 Somewhere', '', 'Detroit', 'MI', '48000')
SELECT * FROM #Employee
生成的邮寄地址
Addr1=123 某处
Addr2=底特律 MI 48000
地址3=
地址4=
或一个带有 cr 字符的字段
地址=
123 某处cr
底特律 MI 48000 cr
cr
cr
一个函数可以很好地返回 Addr1、Addr2、Addr3 和 Addr4,或者只返回 Addr 。
SqueezeAddress(Line1, Line2, Line3, City, State, ZIP)
然后 SqueezeAddress 将返回 Addr1、Addr2、Addr3、Addr4
或
带cr的地址
所有 Addr1-4 行将是 VARCHAR (40) 或者如果使用一个字段 Addr VARCHAR (200)
根据 Phil 在下面 cmets 中的要求,这是当前正在使用的逻辑(删除了许多字段以使其更易于阅读):
SELECT Line1, Line2, Line3,
ISNULL(LTRIM(RTRIM(ADDR.City)) + ', ','') + ISNULL(ADDR.RegionCode,'')
+ ' ' + ISNULL(ADDR.PostalCode,'') AS Line4,
UPDATE #tmpBilling
SET Line1 = Line2, Line2 = NULL
WHERE ISNULL(Line1, '') = ''
AND ISNULL(Line2, '') <> ''
UPDATE #tmpBilling
SET Line2 = Line3, Line3 = NULL
WHERE ISNULL(Line2, '') = ''
AND ISNULL(Line3, '') <> ''
UPDATE #tmpBilling
SET Line2 = Line4, Line4 = NULL
WHERE ISNULL(Line2, '') = ''
AND ISNULL(Line4, '') <> ''
UPDATE #tmpBilling
SET Line3 = Line4, Line4 = NULL
WHERE ISNULL(Line3, '') = ''
AND ISNULL(Line2, '') <> ''
【问题讨论】:
-
这些是列,不是行,对吧?
-
福斯科:更正所有字段都是列。
-
Phil:我还没有尝试过任何东西。我注意到存储过程中有一些逻辑可以将 Addr1 字段一对一地写入表中。然后 4 个不同的 UPDATE 语句将进行比较并在其中一个为空时交换地址行。我会把上面的代码贴出来。
标签: sql-server sql-server-2005 tsql