SQL 子串字符索引
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)
我想我需要使用 substring
和 charindex
但无法正常工作。
在此先感谢您的帮助。
这将找到想要的字符串,但需要相当多的逆向操作才能到达那里。我使用了交叉应用,但你不必。
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)
你可以试试下面
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
这是假设 MS SQL 服务器:
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来反转原始字符串。
- 然后我们找到第一次出现的'/'和下一次出现的'/'之间的子串
- 我们再次反转字符串以找到我们的原始字符串。
假设 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;
returns:
split_part
----------
201312361J
202788279H
我有一个 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)
我想我需要使用 substring
和 charindex
但无法正常工作。
在此先感谢您的帮助。
这将找到想要的字符串,但需要相当多的逆向操作才能到达那里。我使用了交叉应用,但你不必。
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)
你可以试试下面
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
这是假设 MS SQL 服务器:
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来反转原始字符串。
- 然后我们找到第一次出现的'/'和下一次出现的'/'之间的子串
- 我们再次反转字符串以找到我们的原始字符串。
假设 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;
returns:
split_part
----------
201312361J
202788279H