2016-05-30 2 views
12
CREATE TABLE #tmpTbl (m VARCHAR(100)) 
INSERT INTO #tmpTbl VALUES 
(',[Undergraduate1]')  
,(',[Undergraduate10]') 
,(',[Undergraduate11]') 
; 
GO 

select LEFT(m, PATINDEX('%[0-9]%', m)-1) as a, 
     SUBSTRING(m, PATINDEX('%[0-9]%', m), LEN(m)) as b from #tmpTbl 


drop table #tmpTbl 

Привет, учитывая приведенный выше оператор tmptable и select, результат будет следующим.Выбор правильной буквы из строки

  a   |  b 
------------------------------------------------------- 
    ,[Undergraduate  |  1] 
    ,[Undergraduate  |  10] 
    ,[Undergraduate  |  11] 

Однако я хочу, чтобы это было так.

  a   |  b 
------------------------------------------------------- 
    ,[Undergraduate  |  1 
    ,[Undergraduate  |  10 
    ,[Undergraduate  |  11 

Как я могу достичь этого? Я пробовал много сочетания с PATINDEX, LEFT, RIGHT, SUBSTRING, LEN. но не можете получить право] в колонке B

+0

'SUBSTRING (m, PATINDEX ('% [0-9]%', m), LEN (m) - 1)'? –

ответ

8

вы можете заменить, чтобы удалить]. Хитрая, но он добивается того, чего вы хотите

select LEFT(m, PATINDEX('%[0-9]%', m)-1) as a, 
    REPLACE(SUBSTRING(m, PATINDEX('%[0-9]%', m), LEN(m)),']','') as b from #tmpTbl 

альтернатива: реверс строки, подстроку для удаления 1-й символ, обратный назад

select LEFT(m, PATINDEX('%[0-9]%', m)-1) as a, 
     REVERSE(SUBSTRING(REVERSE(SUBSTRING(m, PATINDEX('%[0-9]%', m), LEN(m))),2,LEN(M))) as b from #tmpTbl 
3

Вы можете использовать REPLACE заменить ] с ''

select LEFT(m, PATINDEX('%[0-9]%', m)-1) as a, 
     REPLACE(SUBSTRING(m, PATINDEX('%[0-9]%', m), LEN(m)), ']', '') as b from #tmpTbl 
3

Я склонен использовать stuff() для этой цели:

select replace(stuff(m, 1, patindex(m, '%[0-9]%'), ''), ']', '') 
2

Вот альтернативный подход, который лишит любой текст и просто оставит цифры позади.

SELECT LEFT(subsrt, PATINDEX('%[^0-9]%', subsrt + 't') - 1) 
FROM (
    SELECT subsrt = SUBSTRING(m, pos, LEN(m)) 
    FROM (
     SELECT m, pos = PATINDEX('%[0-9]%', m) 
     FROM #tmpTbl 
    ) d 
) t