SQL 获取倒数第 2 条和第 3 条短划线之间的文本



我有一些数据看起来像这样:

20170101 - Wal-Mart #111-1234-5687789-MC000555555
20170101 - Target -1235-56444878 - MC000555555

我想使用 SQL 查询来获取倒数第 2 和第 3 个破折号之间的字符串,因此结果将是。

1234
1235

如何做到这一点? 由于商店的名称可以有破折号,因此从头开始计算破折号是不可靠的,除非有我不知道的某种技巧。

谢谢。

create table test (data varchar(100));
insert into test values
('20170101 - Wal-Mart #111-1234-5687789-MC000555555'),
('20170101 - Target -1235-56444878 - MC000555555');

WITH Rev As
(
    SELECT REVERSE(data) data
    FROM test
)
, Pos AS
(
    SELECT data,
           CHARINDEX('-', data, CHARINDEX('-', data, 0) + 1) + 1 AS PIni,
           CHARINDEX('-', data, CHARINDEX('-', data, CHARINDEX('-', data, 0)+1)+1) AS PFin
    FROM   Rev
)
SELECT REVERSE(SUBSTRING(data, PIni, PFin - PIni))
FROM   Pos;
GO
|(无列名( ||:--------------- ||1234 ||1235 |

在这里小提琴

我不确定你还会如何处理这个问题,除非你计算破折号。由于您无法从字符串的开头开始计数(由于商店的名称(,也许您可以从末尾开始计数。因此,以下组合应该为您做这件事:

  • SQL 反向 - 反转字符串(因此您可以"从末尾计数"(
  • SQL 字符索引
  • - 获取给定字符串中给定字符的索引
  • SQL子字符串 - 这样您就可以提取所需的数据,一旦你知道倒数第二个和倒数第三个破折号在哪里

希望这有帮助,干杯。

您可以将一个SUBSTRING_INDEX()嵌套在另一个中,如下所示:

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(data,'-',-3),'-',1) FROM `test`

这将提取最后三个"部分",然后从中提取第一个"部分"。

最新更新