我在栏中输入以下文字:
ABC XYZ 100 MG PL/2 ML ABCD
我想提取数字之后ML
之前的所有内容
预期输出:
100 MG PL/2 ML
我尝试将RIGHT
与PATINDEX
一起使用,但是它在数字数据之后显示整个字符串,如下所示:
Select RIGHT(col, PATINDEX('%[^A-Z] %', col))
From table
获得的输出:
100 MG PL/2 ML ABCD
有人可以建议我如何提取这些数据吗?
答案 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)
你可以和
一起去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()
。