SQL选择数字字符后的所有内容

时间:2018-08-28 13:59:12

标签: sql sql-server

我在栏中输入以下文字:

ABC XYZ 100 MG PL/2 ML ABCD

我想提取数字之后ML之前的所有内容

预期输出:

100 MG PL/2 ML

我尝试将RIGHTPATINDEX一起使用,但是它在数字数据之后显示整个字符串,如下所示:

Select RIGHT(col, PATINDEX('%[^A-Z] %', col))
From table

获得的输出:

100 MG PL/2 ML ABCD

有人可以建议我如何提取这些数据吗?

3 个答案:

答案 0 :(得分:2)

 SELECT SUBSTRING(LEFT('ABC XYZ 100 MG PL/2 ML ABCD',CHARINDEX('ML', 'ABC XYZ 100 MG PL/2 ML ABCD') + 2),PATINDEX('%[0-9]%','ABC XYZ 100 MG PL/2 ML ABCD'),LEN('ABC XYZ 100 MG PL/2 ML ABCD'))

-

SELECT SUBSTRING(LEFT(col,CHARINDEX('ML', col) + 2),PATINDEX('%[0-9]%',col),LEN(col))
                                     from table

尽管,您在问题中指出,您希望“ ML”之前的所有内容都在其中,并且期望的输出中包含“ ML”

答案 1 :(得分:1)

您也可以尝试这个

declare @str varchar(50)
set @str='ABC XYZ 100 MG PL/2 ML ABC D'

select @str
select PATINDEX('%[1-9]%',@str),charindex(' ML ',@str),len(@str)
select substring(@str,PATINDEX('%[1-9]%',@str),charindex(' ML ',@str)-PATINDEX('%[1-9]%',@str)+3)

答案 2 :(得分:1)

你可以和

一起去

SQL Fiddle

MS SQL Server 2017架构设置

CREATE TABLE t1 ( col varchar(50) ) ;

INSERT INTO t1 (col)
VALUES 
      ( 'ABC XYZ 100 MG PL/2 ML ABCD' ) 
    , ( 'ABC XYZ 99.9 MG PL/2.5 ML ABCD' )
    , ( 'ABCXYZ 10 mg pl/2 l abcdefghijklmn' )
;

查询1

/* 
    This extracts a substring from col, beginning at the 1st digit
    after a space, and ending at the length of the whole string minus
    the position of the last space minus the position of the 1st digit
    after a space (the first throwaway substring). 
*/

SELECT SUBSTRING( col, 
                  PATINDEX('% [^A-Z]%', col) /* ID 1st digit after space */
                  , LEN(col) /* length of full string */
                    - CHARINDEX(' ',REVERSE(col)) /* identify the last space */
                    - PATINDEX('% [^A-Z]%', col)+1 /* subtract the first throwaway chars also. */
       ) AS ss
FROM t1

Results

|                 ss |
|--------------------|
|     100 MG PL/2 ML |
|  99.9 MG PL/2.5 ML |
|       10 mg pl/2 l |

这不会解释的是,如果最后一组字符中有空格。但这是一个问题,可以调整最终的CHARINDEX()