根据特定的子字符串短语获取数值

use*_*484 6 sql t-sql sql-server substring sql-server-2008

我有如下字母数字文本

 ID Textfield
 1  estimated left ventricular ejection fraction 60-65%
 2  estimated left ventricular ejection fraction is 55-60%
 3  Left ventricular ejection fraction is approximately 40 to 50%
 4  Fractional Short 50 %( 28-48) LV mass 83 gm (<220) systolic function  left ventricular ejection fraction = 52 % 
Run Code Online (Sandbox Code Playgroud)

我需要提取左心室射血分数的数值

输出应该是

ID Lowerbound   Upperbound
1   60            65
2   55            60
3   40            50
4   52            NULL 
Run Code Online (Sandbox Code Playgroud)

我尝试了以下 sql 语法搜索字符 - 它的 ID 3 和 4 失败(对于 ID 4,它给我 50 但应该是 52)

SELECT SUBSTRING(textfield,CHARINDEX('-', 
textfield)-1,10),dbo.udf_GetNumeric(RIGHT(left(textfield,CHARINDEX('- 
',textfield)-1 ),10))AS Lower_bound,left(textfield, CHARINDEX('-', 
textfield) )


,dbo.udf_GetNumeric(SUBSTRING(textfield,CHARINDEX('-', textfield)+1,5)) 
    AS Upper_bound
Run Code Online (Sandbox Code Playgroud)

先感谢您

小智 0

从技术上讲,这适用于您的上限问题,至少在示例数据的范围内:

CASE WHEN RIGHT(TextField, 4) LIKE '%-[1234567890]' + '%' 
    THEN Left(Right(TextField,3),2) 
WHEN RIGHT(TextField, 6) LIKE '%to [1234567890]%'
    THEN Left(Right(TextField,3),2) 
WHEN RIGHT(TextField, 6) LIKE '%= [1234567890]%'
    THEN Left(Right(TextField,4),2) 
END AS UpperBound
Run Code Online (Sandbox Code Playgroud)

但是,你的示例数据非常糟糕,m

  • 仅供参考,您可以使用“%[0-9]%”而不是写出每个数字 (4认同)