我有一个包含地址 1、城市、州和邮政编码的表。但是,某些 address1 还将包含城市、州和邮政编码(用逗号或空格或两者分隔)。示例:
Address1: 9999 western Rd, Los Angeles, CA, 90001
City: Los Angeles
State: CA
Postal: 90001
I want Address1 to be: 9999 western Rd
我尝试了以下 SQL 来修复这些地址:(为了简化,我假设所有字段都不为 null 或为空,在没有州的国家/地区的实际系统中,它将为空或与国家/地区名称相同。)
SELECT LEFT(address1, PATINDEX('%[, ]'+city+'%', billingAddress) - 1)
FROM addresses
WHERE address1 like '%[, ]'+city+'%'+state+'%'+postal_code+'%'
AND PATINDEX('%[, ]'+City+'%', address1) < 12
这里的问题是许多街道名称都包含它们所在的城市。例如,城市
9999 KIRKLAND WAY
中包含 KIRKLAND
,此查询将导致此查询中剩余的街道名称为 9999
。
有没有办法在 SQL 中解决这个问题?
您指出
Address1
列包含完整地址,其他列包含各自的值。考虑:
DECLARE @Addresses TABLE (ID INT IDENTITY, Address1 NVARCHAR(200), Address2 NVARCHAR(50), City NVARCHAR(50), State NVARCHAR(50), PostalCode NVARCHAR(10));
INSERT INTO @Addresses (Address1, Address2, City, State, PostalCode) VALUES (N'9999 western Rd, Los Angeles, CA, 90001', NULL, 'Los Angeles', 'CA', '90001');
SELECT *, TRIM(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(Address1, COALESCE(Address2,''), ''), COALESCE(City,''), ''), COALESCE(State,''), ''), COALESCE(PostalCode,''), ''), ',', '')) AS JustAddress1
FROM @Addresses;
身份证 | 地址1 | 地址2 | 城市 | 状态 | 邮政编码 | 只是地址1 |
---|---|---|---|---|---|---|
1 | 9999 西路,洛杉矶,加利福尼亚州,90001 | 洛杉矶 | CA | 90001 | 西路9999号 |
这基本上只是删除其他列中的值,然后删除逗号。最后它会删除所有前导或尾随空格。
只有假设您的所有地址的列中也有
Address2
、City
、State
和 PostalCode
,这才有效。
最后,SQL Server 并不是真正应该用于字符串操作的地方或工具,但我确实理解有时我们会陷入使用次优解决方案的困境。