SQL:使用 Patindex 函数从字符串中提取数字
SQL: Extract numbers from string using Patindex-function
字符串 #1:King's road 8
字符串 #2:Abbey road5
字符串 #3:Carnaby Street 18-20a
字符串 #5://
字符串 #5:Baker Str. 21a-21e
并将它们分成:
colA:
英皇道
修道院路
卡纳比街
//
贝克街
colB:
8
5
18-20a
空
21a-21e
非常感谢您的帮助!
到目前为止,我尝试使用 "SUBSTRING" 和 "PATINDEX" 将街道名称与街道号码分开,但我不知道如何完成。
DROP TABLE IF EXISTS #Test
CREATE TABLE #Test
(
A VARCHAR(MAX)
)
INSERT INTO #Test VALUES ('King's road 8')
INSERT INTO #Test VALUES ('Abbey road5') -- no ws between number and road
INSERT INTO #Test VALUES ('Carnaby Street 18-20A')
INSERT INTO #Test VALUES ('//') -- if '//" is met, return NULL
INSERT INTO #Test VALUES ('Baker Str. 21a-21e')
SELECT SUBSTRING --here the fun begins, just exemplary...
(
A, PATINDEX('%[0-9]%',A), PATINDEX('%[0-9] [^0-9]%',A + 'e') - PATINDEX('%[0-9]%', A) + 1
) AS Number
FROM #Test
根据你的样本数据和预期结果,用一些比较简单的表达式就可以得到。
SELECT A,
SUBSTRING( A, 0, ISNULL(NULLIF(PATINDEX('%[0-9]%', A), 0), LEN(A)+1)),
SUBSTRING( A, NULLIF(PATINDEX('%[0-9]%', A), 0), LEN(A))
FROM #Test;
对于第一列,我从 0 开始,以避免将 1 减到第一位。然后我使用 ISNULL(NULLIF(,0)LEN(A))
的组合来分配总长度,以防没有数字可用。
对于第二列,我仍然使用NULLIF
,但我不使用ISNULL
以保持值为NULL。然后我只添加字符串的总长度。
字符串 #1:King's road 8
字符串 #2:Abbey road5
字符串 #3:Carnaby Street 18-20a
字符串 #5://
字符串 #5:Baker Str. 21a-21e
并将它们分成:
colA:
英皇道
修道院路
卡纳比街
//
贝克街
colB:
8
5
18-20a
空
21a-21e
非常感谢您的帮助!
到目前为止,我尝试使用 "SUBSTRING" 和 "PATINDEX" 将街道名称与街道号码分开,但我不知道如何完成。
DROP TABLE IF EXISTS #Test
CREATE TABLE #Test
(
A VARCHAR(MAX)
)
INSERT INTO #Test VALUES ('King's road 8')
INSERT INTO #Test VALUES ('Abbey road5') -- no ws between number and road
INSERT INTO #Test VALUES ('Carnaby Street 18-20A')
INSERT INTO #Test VALUES ('//') -- if '//" is met, return NULL
INSERT INTO #Test VALUES ('Baker Str. 21a-21e')
SELECT SUBSTRING --here the fun begins, just exemplary...
(
A, PATINDEX('%[0-9]%',A), PATINDEX('%[0-9] [^0-9]%',A + 'e') - PATINDEX('%[0-9]%', A) + 1
) AS Number
FROM #Test
根据你的样本数据和预期结果,用一些比较简单的表达式就可以得到。
SELECT A,
SUBSTRING( A, 0, ISNULL(NULLIF(PATINDEX('%[0-9]%', A), 0), LEN(A)+1)),
SUBSTRING( A, NULLIF(PATINDEX('%[0-9]%', A), 0), LEN(A))
FROM #Test;
对于第一列,我从 0 开始,以避免将 1 减到第一位。然后我使用 ISNULL(NULLIF(,0)LEN(A))
的组合来分配总长度,以防没有数字可用。
对于第二列,我仍然使用NULLIF
,但我不使用ISNULL
以保持值为NULL。然后我只添加字符串的总长度。