【问题标题】:Method to extract certain Text patterns from a column, between the space and comma从空格和逗号之间的列中提取某些文本模式的方法
【发布时间】:2020-09-17 05:35:01
【问题描述】:

我正在尝试找到从字符串中提取某些模式并将它们存储在单独的列中的正确方法。

这是一个例子:

原始数据

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

我想将提供者的标题存储在单独的列中。 谢谢

【问题讨论】:

  • 这里的模式是什么?您只想要逗号前的空格后的所有内容吗?
  • 那么,基本上,你想要空格和逗号之间的字符串吗? Jean Paul J, KnightJ, Br some, thing 等不太明显的字符串的输出是什么?
  • 请检查sql tag infoedit 中的指南,并提供适当的样本数据、您当前的尝试和预期结果。
  • sql server 的版本是多少?
  • @ZoharPeled 抱歉不是模式。我想从列中提取那些特定的字符串

标签: sql sql-server extract


【解决方案1】:

我已经成功地使用stuffcharindexreverselencross apply 的组合安全地提取了逗号和它之前的最后一个空格之间的字符串部分。
我写“安全”是因为基于stuff 的解决方案在尝试解析格式错误的字符串时不会引发错误,这与基于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

rextester上观看现场演示

【讨论】:

    【解决方案2】:

    如果您的实际数据与您的样本格式完全相同,您可以尝试以下方法-

    select substring(column1,charindex(' ',column1,1),
    charindex(',',column1,1)-charindex(' ','column1,1)) as newcol from tablename
    

    【讨论】:

    • 假设逗号前只能有一个空格,这样就可以了。这是一个有效的假设吗?只有 OP 可以说。
    • @ZoharPeled,我在答案中已经非常清楚地提到了它
    猜你喜欢
    • 1970-01-01
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多