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

Sql server TSQL:如何从字符串中仅提取固定长度的数字,sql-server,tsql,stored-procedures,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 whe

我有一个庞大的客户数据列表。我只想从
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
对于上述代码,以下数据将起作用:

“琼斯街40030”-可以得到“40030”

但以下数据不起作用:

“22街Mel 50630”-只能获取“22”街号,不能获取邮政编码

“65-31坎帕47000 Bau”-只能获得65

“标段199 Guasa 30990 Omar”-只能获得199

所以我的代码可以得到那些只有邮政编码的记录。如果
地址1
包含其他数字,则它不起作用

请帮忙

编辑:


显然,我当前的代码是从“左”开始读取数字,是否有任何方法可以修改当前代码以从右开始读取?

通过您发布的示例,您可以尝试使用以下方法:

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

通过您发布的示例,您可以尝试使用以下内容:

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

把地址的最后一部分去掉怎么样?例如:

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

把地址的最后一部分去掉怎么样?例如:

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

您数据中的邮政编码是否始终位于地址的末尾/最后一部分?如果您有大量数据,则邮政编码应为单独的字段。想象一下,每次要搜索一个邮政编码时,都要分析1M行。@PanagiotisKanavos数据是由客户端提供的,所以我现在需要筛选并分离到另一列。@Tyron78据我所知,是的,大部分邮政编码都在最后一列附近part@KooSengSeng这叫做净化。使用SSI或程序执行此操作要容易得多。不是写所有这些代码,而是在将数据加载到自己的数据库时提取最后五个字符。数据中的邮政编码是否始终位于地址的末尾/最后一部分?如果有大量数据,邮政编码应该是一个单独的字段。想象一下,每次要搜索一个邮政编码时,都要分析1M行。@PanagiotisKanavos数据是由客户端提供的,所以我现在需要筛选并分离到另一列。@Tyron78据我所知,是的,大部分邮政编码都在最后一列附近part@KooSengSeng这叫做净化。使用SSI或程序执行此操作要容易得多。不是编写所有这些代码,而是在将数据加载到自己的数据库时提取最后五个字符抱歉,我刚刚添加了另外两个示例数据,使用
RIGHT
不起作用,因为post代码不完全在最后一部分。我修改了查询:在反转的字符串上使用Regexp并再次反转结果…哇,太好了。了解有关反向<代码>的新信息。非常感谢,非常感谢。我刚刚添加了另外两个示例数据,使用
RIGHT
不起作用,因为post代码不完全在最后一部分。我修改了查询:在反转的字符串上使用Regexp并再次反转结果……哇,太好了。了解有关反向<代码>的新信息。非常感谢,非常感谢