REGEXP_SUBSTR SQL Server

时间:2017-10-03 13:25:18

标签: sql sql-server

With T as
( 
select 'Cytomegalovirus Nucleoside Analog DNA Polymerase Inhibitor [EPC],DNA Polymerase Inhibitors [MoA],Nucleoside Analog [Chemical/Ingredient],Nucleoside Analog Antiviral [EPC]' CLASS 
FROM DUAL )

需要使用[EPC]拉弦。

期望的输出:

Cytomegalovirus Nucleoside Analog DNA Polymerase Inhibitor [EPC], Nucleoside Analog Antiviral [EPC]

1 个答案:

答案 0 :(得分:1)

您不需要真正的正则表达式,因为您的拆分字符串是文字。在SQL Server 2017上,这应该工作(未测试):

SELECT STRING_AGG([value], ',')
FROM STRING_SPLIT('Cytomegalovirus Nucleoside Analog DNA Polymerase Inhibitor [EPC],DNA Polymerase Inhibitors [MoA],Nucleoside Analog [Chemical/Ingredient],Nucleoside Analog Antiviral [EPC]', ',')
WHERE [value] LIKE '%\[EPC\]%' ESCAPE '\'

在SQL Server 2016上,我们缺少STRING_AGG,但我们确实有STRING_SPLIT,因此这将有效(已测试):

SELECT STUFF((
    SELECT ',' + [value]
    FROM STRING_SPLIT('Cytomegalovirus Nucleoside Analog DNA Polymerase Inhibitor [EPC],DNA Polymerase Inhibitors [MoA],Nucleoside Analog [Chemical/Ingredient],Nucleoside Analog Antiviral [EPC]', ',')
    WHERE [value] LIKE '%\[EPC\]%' ESCAPE '\'
    FOR XML PATH('')
), 1, 1, '')

在早期版本中,缺乏正常执行的原生字符串拆分使得这背后的巨大痛苦。很多问题都与此有关,例如this one。将这些解决方案中的任何一个与FOR XML PATH技巧结合使用即可实现。

或者,CLR函数可以更清晰,更快速地执行此操作(并使用真正的正则表达式),但实现这些功能更为复杂。 This question是一个良好的开端。

最后但并非最不重要:如果您必须在SQL中执行这些类型的操作,这通常表明您的数据库设计缺乏。特别是,逗号分隔值应该是具有EPC BIT NOT NULL列(或更一般地,CategoryID INT REFERENCES Categories(ID)列)的单独行,您应该考虑让客户端代码以某种方式存储数据的方法这适合您的数据库进行有效操作。规范化是这里的关键字。