从 space 和逗号之间的列中提取某些文本模式的方法
Method to extract certain Text patterns from a column, between the space and comma
我正在尝试找到从字符串中提取特定模式并将它们存储在单独列中的正确方法。
这是一个例子:
原始数据
Smith Pa, Coleman
John Pa-C, Fred
Justin DO, Jack
John OT, Press
Jack ARNP, Nate
Johm DPM, King
期望的输出
Pa
Pa-C
DO
OT
ARNP
DPM
我想将提供者的标题存储在单独的列中。
谢谢
如果您的实际数据与样本的格式完全相同,您可以尝试以下方法-
select substring(column1,charindex(' ',column1,1),
charindex(',',column1,1)-charindex(' ','column1,1)) as newcol from tablename
我已经成功地使用 stuff
、charindex
、[=15= 的组合安全地提取逗号和最后一个 space 之间的字符串部分]、len
和 cross apply
.
我写“安全”是因为如果基于 stuff
的解决方案尝试解析 ill-formatted 字符串,则不会引发错误,这与基于 substring
的解决方案不同,如您所见,它会抛出一个“传递给 LEFT 或 SUBSTRING 函数的长度参数无效”错误。
首先,创建并填充示例数据(请在您以后的问题中省去这一步:
DECLARE @T AS TABLE (
Col varchar(50)
);
INSERT INTO @T (Col) VALUES
-- Valid examples
('Smith Pa, Coleman'),
('John Pa-C, Fred'),
('Justin DO, Jack'),
('John OT, Press'),
('Jack ARNP, Nate'),
('Johm DPM, King'),
-- Invalid examples
('NoSpaceTITLE, LastName'),
('No Comma TITLE LastName'),
-- Strange, but not really invalid example
('Van Damme ACTOR, Jean-Claude');
注意:我在示例数据中添加了一些无效示例,以及一个并非真正无效但与其他示例不同的示例。
查询:
SELECT Col
, NULLIF(STUFF(BeforeComma, 1, LEN(BeforeComma) - CHARINDEX(' ', REVERSE(BeforeComma)) + 1, ''), '') As SafeTitle
FROM @T
CROSS APPLY (SELECT STUFF(Col, CHARINDEX(',', Col), LEN(Col), '') As BeforeComma) As A
注意:使用 cross apply
允许我计算逗号前的字符串一次,但在查询本身中使用它三次。
结果:
Col SafeTitle
Smith Pa, Coleman Pa
John Pa-C, Fred Pa-C
Justin DO, Jack DO
John OT, Press OT
Jack ARNP, Nate ARNP
Johm DPM, King DPM
NoSpaceTITLE, LastName NULL
No Comma TITLE LastName NULL
Van Damme ACTOR, Jean-Claude ACTOR
上观看现场演示
我正在尝试找到从字符串中提取特定模式并将它们存储在单独列中的正确方法。
这是一个例子:
原始数据
Smith Pa, Coleman
John Pa-C, Fred
Justin DO, Jack
John OT, Press
Jack ARNP, Nate
Johm DPM, King
期望的输出
Pa
Pa-C
DO
OT
ARNP
DPM
我想将提供者的标题存储在单独的列中。 谢谢
如果您的实际数据与样本的格式完全相同,您可以尝试以下方法-
select substring(column1,charindex(' ',column1,1),
charindex(',',column1,1)-charindex(' ','column1,1)) as newcol from tablename
我已经成功地使用 stuff
、charindex
、[=15= 的组合安全地提取逗号和最后一个 space 之间的字符串部分]、len
和 cross apply
.
我写“安全”是因为如果基于 stuff
的解决方案尝试解析 ill-formatted 字符串,则不会引发错误,这与基于 substring
的解决方案不同,如您所见,它会抛出一个“传递给 LEFT 或 SUBSTRING 函数的长度参数无效”错误。
首先,创建并填充示例数据(请在您以后的问题中省去这一步:
DECLARE @T AS TABLE (
Col varchar(50)
);
INSERT INTO @T (Col) VALUES
-- Valid examples
('Smith Pa, Coleman'),
('John Pa-C, Fred'),
('Justin DO, Jack'),
('John OT, Press'),
('Jack ARNP, Nate'),
('Johm DPM, King'),
-- Invalid examples
('NoSpaceTITLE, LastName'),
('No Comma TITLE LastName'),
-- Strange, but not really invalid example
('Van Damme ACTOR, Jean-Claude');
注意:我在示例数据中添加了一些无效示例,以及一个并非真正无效但与其他示例不同的示例。
查询:
SELECT Col
, NULLIF(STUFF(BeforeComma, 1, LEN(BeforeComma) - CHARINDEX(' ', REVERSE(BeforeComma)) + 1, ''), '') As SafeTitle
FROM @T
CROSS APPLY (SELECT STUFF(Col, CHARINDEX(',', Col), LEN(Col), '') As BeforeComma) As A
注意:使用 cross apply
允许我计算逗号前的字符串一次,但在查询本身中使用它三次。
结果:
Col SafeTitle
Smith Pa, Coleman Pa
John Pa-C, Fred Pa-C
Justin DO, Jack DO
John OT, Press OT
Jack ARNP, Nate ARNP
Johm DPM, King DPM
NoSpaceTITLE, LastName NULL
No Comma TITLE LastName NULL
Van Damme ACTOR, Jean-Claude ACTOR
上观看现场演示