TSQL:如何从字符串中仅提取固定长度的数字

时间:2017-09-19 09:23:37

标签: sql-server tsql stored-procedures

我有大量客户数据。我想只从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读取?

2 个答案:

答案 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