SQL获取第二个最后一个和第三个最后一个破折号

时间:2017-05-23 22:19:31

标签: sql substring

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

20170101 - Wal-Mart #111-1234-5687789-MC000555555

20170101 - Target -1235-56444878 - MC000555555

我想使用SQL查询来获取第二个最后一个和第三个破折号之间的字符串,因此结果将是。

1234

1235

如何实现这一目标?由于商店的名称可以有破折号,从头开始计算破折号是不可靠的,除非有一些我不知道的技巧。

感谢。

3 个答案:

答案 0 :(得分:1)

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
| (No column name) |
| :--------------- |
| 1234             |
| 1235             |

dbfiddle here

答案 1 :(得分:0)

我不确定你会怎么做到这一点,除非你计算破折号。由于您无法从字符串的开头开始计数(因为商店的名称),也许您可​​以从最后开始计算。因此,以下各项的组合应该适合您:

  • SQL reverse - 反转字符串(这样你就可以“从头算起”)
  • SQL charindex - 获取给定字符串中给定字符的索引
  • SQL substring - 一旦你知道第二个最后一个和最后一个破折号在哪里
  • ,你就可以提取所需的数据

希望这会有所帮助,欢呼。

答案 2 :(得分:0)

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

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

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