2016-12-21 2 views
0

Мне нужно получить определенную часть из строки.Как получить определенную часть из строки в SQL

В следующем примере поле POSITION содержит A- блок, блок M-0000000359 и, наконец, блок справа от /.

Теперь мне нужно заполнить полный номер справа от /, и если есть ,, то можно использовать только полный номер до запятой.

Так что, если следующий выход POSITION будет A-M-0000000359/10 или A-M-0000000359/10,10 то результат мне сейчас нужно в обоих случаях 10.

SQL

SELECT POSITION 
    ,SUBSTRING((REPLACE(POSITION, SUBSTRING((POSITION), 1, CHARINDEX('/', (POSITION), 1)), '')), 1, CHARINDEX('/', (POSITION), 0)) AS TRIM_A 
    ,SUBSTRING((REPLACE(POSITION, SUBSTRING((POSITION), 1, CHARINDEX('/', (POSITION), 1)), '')), 0, CHARINDEX(',', ((REPLACE(POSITION, SUBSTRING((POSITION), 1, CHARINDEX('/', (POSITION), 1)), ''))), 1)) AS TRIM_B 
    ,* 
FROM ORDER 

Выход

POSITION    |TRIM_A|TRIM_B 
---------------------|------|------| 
A-M-0000000359/1  |1 
---------------------|------|------| 
A-M-0000000359/1,10 |1,10 1 
+0

Ваши примеры показать, что вы хотите в фиксированных позициях. Это правда в целом? –

+0

Пример (SQL & Output), где я застрял в данный момент. Результат, который вы видите, работает, если это отвечает на ваш вопрос. – oldsport

+0

Итак, каков ваш вопрос о вашем текущем коде? – scsimon

ответ

3

Вы можете сделать это с CASE заявление тогда. Измените переменную @position, чтобы проверить ее.

declare @position varchar(64)= 'A-M-0000000359/1111,10' 

select 
    case 
     when patindex('%,%',@position) > 0 
     then substring(substring(@position,CHARINDEX('/',@position) + 1,len(@position) - CHARINDEX('/',@position)),1,patindex('%,%',substring(@position,CHARINDEX('/',@position) + 1,len(@position) - CHARINDEX('/',@position))) - 1) 
     else substring(@position,CHARINDEX('/',@position) + 1,len(@position) - CHARINDEX('/',@position)) 
    end 
+0

Thx! Но это дает мне только последний номер ('10'). Но он должен основываться на вашем примере '1'. – oldsport

+0

исправил его, так как вы хотите первый. попробуйте @oldsport – scsimon

+0

Вместо 'patindex()', я бы просто использовал 'like'. –

1

Возможно, более легкая альтернатива

Declare @YourTable table (Position varchar(50)) 
Insert Into @YourTable values 
('A-M-0000000359/1,10'), 
('A-M-0000000359/1'), 
('A-M-0000000359') 


Select A.* 
     ,Trim_A = case when charindex('/',Position)=0 then '' else substring(Position,charindex('/',Position)+1,50) end 
     ,Trim_B = case when charindex(',',Position)=0 then '' 
        else substring(Position,charindex('/',Position)+1,charindex(',',Position)-charindex('/',Position)-1) 
        end 
From @YourTable A 

Возвращает

Position    Trim_A Trim_B 
A-M-0000000359/1,10 1,10  1 
A-M-0000000359/1  1 
A-M-0000000359  
+0

Престижность для принятия дополнительного шага в случае, если бы не было/ – scsimon

+0

@scsimon Просто всегда шокирован, когда пользователь возвращается, как говорит: «Это работает, но у меня также есть это условие. 3 решения для этого парня, каждый раз, когда происходит другое падение информации. http://stackoverflow.com/questions/41232461/sql-server-need-to-correct-the-numbering-pattern-from-abc-1-1-1-to-abc- 001-001/41232574 # 41232574 –

1

Можете ли вы попробовать это, я нашел, что это очень просто и легко понять, что мы можем просто сделать это с помощью CASE

create table #test(block varchar(50)) 

insert into #test values 
('A-M-0000000359/10,11'), ('A-M-0000000359/10') 

select substring(block, charindex('/', block)+1, 
    case when charindex(',', block) = 0 then 
     len(block) 
    else 
     (charindex(',', block)-1)-charindex('/', block) 
    end) finalValue 
from #test 

OUTPUT 
---------- 
finalValue 
10 
10 
Смежные вопросы