Получить числовые значения на основе конкретной фразы подстроки - PullRequest
0 голосов
/ 07 июня 2018

У меня есть буквенно-цифровой текст, как показано ниже

 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 % 

Мне нужно извлечь числовые значения для фракции выброса левого желудочка

Вывод должен быть

ID Lowerbound   Upperbound
1   60            65
2   55            60
3   40            50
4   52            NULL 

IЯ пробовал ниже поиск по синтаксису в sql для символов - он мне не удался для идентификаторов 3 и 4 (для идентификатора 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

Заранее спасибо

Ответы [ 3 ]

0 голосов
/ 07 июня 2018

Пожалуйста, попробуйте этот код и дайте мне знать, если это работает для всего вашего набора данных.Предположения здесь:

1) Ваши цифры всегда идут после слов «фракция выброса левого желудочка»

2) Нет никаких других цифр после слов «фракция выброса левого желудочка», кромезначения, которые определяют нижнюю и верхнюю границы

3) Нижняя и верхняя границы всегда идут слева направо (от малого к большому)

4) Имя вашей стартовой таблицы: # temp

 declare @temp table (id int, field varchar(max))
 insert @temp

 select id, replace(right(Textfield, len(Textfield)-charindex('left ventricular ejection fraction', Textfield)+1),
'left ventricular ejection fraction','') field  
 from #temp 

 declare @holding table (id int, lowerbd varchar(max), upperbd varchar(max)) 
 declare @iterator int =1
 declare @prevfield varchar(max)
 declare @field varchar(max)
 declare @originalfield varchar(max)
 declare @number varchar(max)=''

 while @iterator<=(select max(id) from @temp)
 begin

 select @originalfield = field from @temp where id=@iterator

 while len(@originalfield) >0
 begin

 set @prevfield=@field

 select @field=left(@originalfield,1) 

 set @originalfield= 
 case 
 when len(@originalfield)>1 then substring(@originalfield, 2, len(@originalfield))
 else '' end 

 if  @field like '%[0-9]%'  
 begin
 set @number = @number+@field
 end
 if @field like '%[0-9]%' and @prevfield like '%[0-9]%'
 begin
     if not exists(select 1 from @holding where id= @iterator)
     begin
     insert @holding
     select @iterator, @number, null
     set @number=''
     end
     else   
     begin
     insert @holding
     select @iterator, null, @number
     set @number=''
     end

 end


end
set @iterator=@iterator+1
end

select id, max(lowerbd)lowerbd, max(upperbd)upperbd from @holding 
group by id
0 голосов
/ 08 июня 2018

Это будет использовать несколько CROSS APPLYs, чтобы все ближе и ближе.Некоторые замены делают строку сопоставимой. Первый пробел с задней стороны - это граница.Остальное довольно просто.

DECLARE @tbl TABLE(ID INT, Textfield VARCHAR(500));
INSERT INTO @tbl VALUES
 (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 % ');

SELECT ID
      ,Rev
      ,substr
      ,CASE WHEN hyph>0 THEN LEFT(substr,hyph-1) ELSE substr END AS LowerBound
      ,CASE WHEN hyph>0 THEN SUBSTRING(substr,hyph+1,10) ELSE NULL END AS UpperBound
FROM @tbl t
CROSS APPLY(SELECT REVERSE(RTRIM(REPLACE(REPLACE(t.Textfield,' to ','-'),' %','%')))) AS A(Rev)
CROSS APPLY(SELECT PATINDEX('% [^1-9]%',A.Rev)) AS B(pos)
CROSS APPLY(SELECT LTRIM(RTRIM(REPLACE(REVERSE(LEFT(A.Rev,B.pos)),'%','')))) AS C(substr)
CROSS APPLY(SELECT CHARINDEX('-',C.substr)) AS D(hyph);
0 голосов
/ 07 июня 2018

Технически, это работало бы для вашей проблемы Upperbound, по крайней мере, в пределах ваших примерных данных:

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

Но, ваши примерные данные очень плохие, m

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...