在长字符串中的两个单词之间选择子字符串

时间:2019-02-12 01:01:39

标签: sql-server

我有一个带有大字符串列的表,称为“ HL7_MESSAGE”,我需要从几个关键字中提取一个字符串,如下面的代码所示。我是Oracle人士,因此代码已编写并可以在Oracle SQL中工作,但我需要将其转换为SQL Server代码。 SQL Server没有Regexp_substr函数,但我无法使用charindex或Patindex使它正常工作。基本上,我在两个字符串之间选择一个字符串,然后在解码语句中查找两个单词/部分之间是否缺少数据。如果它只是找到“ .br \”,那么它将丢失数据,而我只是将其标记为丢失或已填充。无论如何,代码在下面...如果有人可以将其解码为SQL Server 2011版,我将不胜感激。

代码:

select

primary_key,

trim(REPLACE(trim(regexp_substr(hl7_message, 'RHRN:(.*)BIRTHDATE:', 1, 1, null, 1)),'\.br\',' ')) AS PATIENT_RHRN,

trim(REPLACE(trim(regexp_substr(hl7_message, 'PATIENT NAME:(.*)RHRN:', 1, 1, null, 1)),'\.br\',' ')) AS PATIENT_NAME,

trim(REPLACE(trim(regexp_substr(hl7_message, 'ULI:(.*)GENDER:', 1, 1, null, 1)),'\.br\',' ')) AS PATIENT_ULI,

decode(replace(to_char(regexp_substr(hl7_message,'FINDINGS:(.*)ADVERSE EVENTS:',1,1,'',1)),'\.br\'),NULL, 'missing', 'filled') FINDINGS_TO_ADVS_EVENTS_FLAG,

decode(replace(to_char(regexp_substr(hl7_message,'IMPRESSIONS:(.*)RECOMMENDATIONS:',1,1,'',1)),'\.br\'),NULL, 'missing', 'filled') IMPRESSION_TO_RECOMM_FLAG,

decode(replace(to_char(regexp_substr(hl7_message,'RECOMMENDATIONS:(.*)_____________________________',1,1,'',1)),'\.br\'),NULL, 'missing', 'filled') RECOMM_TO_SIG_UNDERLINE

   from TEST;

谢谢

1 个答案:

答案 0 :(得分:0)

下面我提供了一个使用patindex和substring从另外两个字符串之间的字符串中提取信息的简单示例,希望这将成为您进行转换的基础。

DECLARE @a varchar(300) = 'this is a long string I will extract data from'

PRINT SUBSTRING(@a, PATINDEX('% long %', @a) + LEN('% long %')-2, PATINDEX('% extract %', @a) - (PATINDEX('% long %', @a) + LEN('% long %')-2))

关键在于使用两种patindex模式来确定起点和长度:

首先找到第一个字符串模式的结尾(Patindex查找开始,len-2结束):

Patindex(pattern, string) + LEN(pattern, string) - 2 

然后找到长度,使用Patindex查找第二个字符串的开头,然后减去上面找到的起点。

Patindex(pattern, string) - (Patindex(start pattern, string) + LEN(start pattern, string) - 2 )

我希望这会有所帮助。