Подстрока SQL charindex - PullRequest
       35

Подстрока SQL charindex

0 голосов
/ 25 октября 2018

У меня есть поле SQL с такой строкой

27/08/2018 to 31/08/2018 - GCH/10561/<b>201312361J</b>/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но не могу заставить его работать.

Заранее спасибо за помощь.

Ответы [ 4 ]

0 голосов
/ 25 октября 2018

Предполагая, что 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
0 голосов
/ 25 октября 2018

Вы можете попробовать ниже

ДЕМО

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
0 голосов
/ 25 октября 2018

Предполагается, что 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)))));

Объяснение:

  • Сначала мы переворачиваем исходную строку, используя реверс.
  • Затем мы находим подстрокумежду первым вхождением '/' и следующим вхождением '/'
  • Мы снова инвертируем строку, чтобы найти нашу исходную строку.
0 голосов
/ 25 октября 2018

Это найдет искомую строку, но для ее достижения требуется довольно много изменений.Я использовал кросс-аппликацию, но вы не обязаны.

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)
...