Выбор правильной буквы из строки
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
Ответы
Ответ 1
вы можете использовать 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-й char, назад назад
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
Ответ 2
Вы можете использовать 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]%'), ''), ']', '')
Ответ 4
Вот альтернативный подход, который лишит любой текст и просто оставит числа позади.
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