T SQL 提取倒数第二个和最后一个逗号之间的字符串
T SQL Extract String between penultimate and last comma
我正在使用 MS SQL Server 2014 SP3。
我有一个名为 person_loader
的列,其中包含一个大字符串。我无法控制它,因为它来自第三方系统。
示例数据:
1. Bob Smith, 01/01/1980, "email: bob@test.com, mobile: 012345687",USA, Joiner, 05/04/2022
2. Dolly Smith, 02/03/1978, "email: dolly@test.com", UK, Singer,
3. Dave Smith, 09/08/78,"mobile: 98745632", USA, Unemployed, 04/04/2022
4. Bud Smith, 07/07/80,"email:bud.smith@test.com, mobile: 0147852369", UK, Dr,
我想提取倒数第二个和最后一个','之间的字符串。这是结果:
1. Joiner
2. Singer
3. Unemployed
4. Dr
有时字符串不会以日期结尾,但总会有一个逗号。
我可以提取最后一个逗号右边的所有内容,但我该如何在此基础上构建?
SELECT RIGHT([person_loader], CHARINDEX(',', REVERSE([person_loader])) - 1)
FROM tblCustomer;
在 SQL 服务器的较新(和受支持)版本中,使用 OPENJSON
可以更容易。在不受支持的旧版本中,您会遇到丑陋的字符串解析......这不是 SQL 服务器的强项之一。
;WITH level1 AS
(
SELECT pl = SUBSTRING
(
person_loader,
1,
LEN(person_loader) - CHARINDEX(',', REVERSE(person_loader))
)
FROM dbo.tblCustomer
)
SELECT LTRIM(RIGHT(pl, CHARINDEX(',', REVERSE(pl))-1)) FROM level1;
输出:
(No column name)
Joiner
Singer
Unemployed
Dr
当然,如果 table 中的字符串带有一个或零个逗号,这将失败。您可以使用一堆额外的(甚至更丑陋的)COALESCE(NULLIF(
处理来处理这个问题(连同空字符串和 NULL
):
;WITH level1 AS
(
SELECT pl = SUBSTRING
(
person_loader,
1,
LEN(person_loader)
- COALESCE(NULLIF(CHARINDEX(',',
REVERSE(person_loader)),0),0)
)
FROM dbo.tblCustomer
)
SELECT COALESCE(LTRIM(RIGHT(pl,
COALESCE(NULLIF(CHARINDEX(',',
REVERSE(pl)), 0),1)-1)), '')
FROM level1;
我正在使用 MS SQL Server 2014 SP3。
我有一个名为 person_loader
的列,其中包含一个大字符串。我无法控制它,因为它来自第三方系统。
示例数据:
1. Bob Smith, 01/01/1980, "email: bob@test.com, mobile: 012345687",USA, Joiner, 05/04/2022
2. Dolly Smith, 02/03/1978, "email: dolly@test.com", UK, Singer,
3. Dave Smith, 09/08/78,"mobile: 98745632", USA, Unemployed, 04/04/2022
4. Bud Smith, 07/07/80,"email:bud.smith@test.com, mobile: 0147852369", UK, Dr,
我想提取倒数第二个和最后一个','之间的字符串。这是结果:
1. Joiner
2. Singer
3. Unemployed
4. Dr
有时字符串不会以日期结尾,但总会有一个逗号。
我可以提取最后一个逗号右边的所有内容,但我该如何在此基础上构建?
SELECT RIGHT([person_loader], CHARINDEX(',', REVERSE([person_loader])) - 1)
FROM tblCustomer;
在 SQL 服务器的较新(和受支持)版本中,使用 OPENJSON
可以更容易。在不受支持的旧版本中,您会遇到丑陋的字符串解析......这不是 SQL 服务器的强项之一。
;WITH level1 AS
(
SELECT pl = SUBSTRING
(
person_loader,
1,
LEN(person_loader) - CHARINDEX(',', REVERSE(person_loader))
)
FROM dbo.tblCustomer
)
SELECT LTRIM(RIGHT(pl, CHARINDEX(',', REVERSE(pl))-1)) FROM level1;
输出:
(No column name) |
---|
Joiner |
Singer |
Unemployed |
Dr |
当然,如果 table 中的字符串带有一个或零个逗号,这将失败。您可以使用一堆额外的(甚至更丑陋的)COALESCE(NULLIF(
处理来处理这个问题(连同空字符串和 NULL
):
;WITH level1 AS
(
SELECT pl = SUBSTRING
(
person_loader,
1,
LEN(person_loader)
- COALESCE(NULLIF(CHARINDEX(',',
REVERSE(person_loader)),0),0)
)
FROM dbo.tblCustomer
)
SELECT COALESCE(LTRIM(RIGHT(pl,
COALESCE(NULLIF(CHARINDEX(',',
REVERSE(pl)), 0),1)-1)), '')
FROM level1;