我有一些数据看起来像这样:
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`
这将提取最后三个"部分",然后从中提取第一个"部分"。