выбор правильной буквы из строки

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


person Devora    schedule 30.05.2016    source источник


Ответы (4)


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

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
person Nick Kavadias    schedule 30.05.2016

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

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

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

select replace(stuff(m, 1, patindex(m, '%[0-9]%'), ''), ']', '')
person Gordon Linoff    schedule 30.05.2016

Вот альтернативный подход, который удалит любой текст и просто оставит числа.

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
person Dave Barker    schedule 30.05.2016