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 列中的 ]

4

4 回答 4

8

您可以使用替换删除]。狡猾,但它实现了你想要的

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

替代方案:反转字符串,删除第一个字符的子字符串,反转返回

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
于 2016-05-30T01:43:23.503 回答
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
于 2016-05-30T01:45:27.440 回答
3

我倾向于stuff()用于此目的:

select replace(stuff(m, 1, patindex(m, '%[0-9]%'), ''), ']', '')
于 2016-05-30T01:47:58.510 回答
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
于 2016-05-30T01:55:01.443 回答