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;