SQL子字符串charindex

时间:2018-10-25 04:47:41

标签: sql substring charindex

我有一个带有这样字符串的SQL字段

27/08/2018 to 31/08/2018 - GCH/10561/201312361J/HO
04/09/2018 to 07/09/2018 - GCH/2836/202788279H/WAL

此字符串具有我需要提取的参考代码。上面加粗了一个。

问题是字符串之前的字符串长度并不总是相同。请参阅上面的第二个示例。

如何每次都提取该代码?

我已经尝试过了,但是我需要在最后一个“ /”的左侧.....

SELECT Right('27/08/2018 to 31/08/2018 - GCH/10561/201312361J/HO', CHARINDEX('/','27/08/2018 to 31/08/2018 - GCH/10561/201312361J/HO')-1)

我认为我需要使用substringcharindex,但无法正常使用。

在此先感谢您的帮助。

4 个答案:

答案 0 :(得分:0)

这将找到所需的字符串,但是需要相当多的反转才能到达该字符串。我使用了交叉申请,但您不必这样做。

CREATE TABLE test(
   column_a VARCHAR(50) NOT NULL PRIMARY KEY
);
INSERT INTO test(column_a) VALUES ('27/08/2018 to 31/08/2018 - GCH/10561/201312361J/HO');
INSERT INTO test(column_a) VALUES ('04/09/2018 to 07/09/2018 - GCH/2836/202788279H/WAL');


select
      column_a, ca.x
from test
cross apply (
    select reverse(substring(reverse(column_a),CHARINDEX('/',reverse(column_a))+1,10))
    ) ca (x)

答案 1 :(得分:0)

您可以在下面尝试

DEMO

declare @text varchar(64)
set @text='27/08/2018 to 31/08/2018 - GCH/10561/201312361J/HO'
select reverse(substring(reverse(right(@text,CHARINDEX('-',@text)-3)),CHARINDEX('/',reverse(right(@text,CHARINDEX('-',@text)-3)))+1,10))

输出:

val
201312361J

答案 2 :(得分:0)

这是假设使用MS SQL Server:

declare @rev varchar(64)
set @rev=reverse('27/08/2018 to 31/08/2018 - GCH/10561/201312361J/HO')
SELECT 
reverse(SUBSTRING ( @rev,  charindex('/', @rev) + 1, charindex('/', substring(@rev, (charindex('/', @rev) + 1) + 1, Len(@rev)))));

说明:

  • 首先,我们使用reverse反转原始字符串。
  • 然后我们在第一次出现的'/'和下一次出现的'/'之间找到子字符串
  • 我们再次反转字符串以找到原始字符串。

答案 3 :(得分:0)

假设Postgres并且-始终位于第二组信息之前:

with test(data) as (
values 
  ('27/08/2018 to 31/08/2018 - GCH/10561/201312361J/HO'), 
  ('04/09/2018 to 07/09/2018 - GCH/2836/202788279H/WAL')
)
select split_part(split_part(data, '-', 2), '/', 3)
from test;

返回:

split_part
----------
201312361J
202788279H