我有大量客户数据。我想只从Address1
列获得5位数的邮政编码。
我有下面的杂乱代码:
SELECT
(SELECT LEFT(SUBSTRING(Address1, PATINDEX('%[0-9]%', Address1), 8000),
PATINDEX('%[^0-9]%', SUBSTRING(Address1, PATINDEX('%[0-9]%', Address1), 8000) + 'X') -1))
FROM CustomerList where LEN(LEFT(SUBSTRING(Address1, PATINDEX('%[0-9]%', Address1), 8000),
PATINDEX('%[^0-9]%', SUBSTRING(Address1, PATINDEX('%[0-9]%', Address1), 8000) + 'X') -1)) = 5 -- Get only records that has exactly 5 value
对于上述代码,以下数据将起作用:
“Str.Jt.Jones 40030” - 可以获得“40030”
但以下数据不起作用:
“22 Str.Mel 50630” - 只能获得“22”街道号码,而不是邮政编码。
“65-31 Kampar 47000 Bau” - 只能达到65
“Lot 199 Guasa 30990 Omar” - 只能获得199
所以我的代码可以获得那些只有邮政编码的记录。如果Address1
包含其他数字,则不起作用。
请帮忙。
编辑:
显然我的当前代码是从“LEFT”开始读取数字,有没有什么方法可以修改当前代码来开始从RIGHT读取?
答案 0 :(得分:2)
如何简单地删除地址的最后一部分?如:
DECLARE @Address1 NVARCHAR(100) = 'Lot 199 Guasa 30990 Omar';
SELECT
(SELECT REVERSE(LEFT(SUBSTRING(REVERSE(@Address1), PATINDEX('%[0-9]%', REVERSE(@Address1)), 8000),
PATINDEX('%[^0-9]%', SUBSTRING(REVERSE(@Address1), PATINDEX('%[0-9]%', REVERSE(@Address1)), 8000) + 'X') -1))) AS PostCode
答案 1 :(得分:0)
您发布的示例可以尝试使用以下内容:
WITH X AS (SELECT '65-31 Kampar 47000 Bau' AS A UNION ALL SELECT 'Str. Jt. Jones 40030' UNION ALL SELECT 'Lot 199 Guasa 30990 Omar' )
SELECT REVERSE(SUBSTRING( REVERSE(A), patindex('%[0-9]%', REVERSE(A)) ,5) ) FROM X
输出:
47000
40030
30990