如何从带有字母数字短语和字母字符的字符串中提取字母数字短语

时间:2021-01-26 15:16:10

标签: sql sql-server

我有一列可以包含以下可能的值 -

  1. ITO26218361281-简

  2. SBC28791827135 VATS

  3. SOT21092832917 约翰·多伊

  4. TIM INQ12109283291

  5. 简·多伊 12/15

我只想从类似于上面的字符串中提取 14 位字母数字短语。如果记录类似于 (5),我仍然希望该记录存在以便能够将其作为错误调用。我不需要完全相同的文本,我只需要将其标记为错误。

预期结果 -

  1. ITO26218361281

  2. SBC28791827135

  3. SOT21092832917

  4. INQ12109283291

  5. JANE DOE 12/15(或标记为错误)

1 个答案:

答案 0 :(得分:0)

我假设您使用的是最近的 SQL Server 版本,并且可以访问 STRING_SPLIT() 函数(SQL Server 2016 及更高版本)。

  1. 使用 string_split() 函数拆分值。这为您提供了一个 value 列。
  2. 在需要时使用 - 函数从您的第一个示例行中删除破折号 (replace())。如果有许多随机尾随字符,您可能需要多准备一些数据。
  3. 前 3 个字符不应是数字。
  4. 所有剩余的字符都必须是数字。

示例数据

create table data
(
  input nvarchar(50)
);

insert into data (input) values
('ITO26218361281- JANE'),
('SBC28791827135 VATS'),
('SOT21092832917 JOHN DOE'),
('TIM INQ121092832917');

解决方案

select replace(s.value, '-', '') as result
from data d
cross apply string_split(d.input, ' ') s
where isnumeric(left(s.value, 3)) = 0
  and isnumeric(substring(replace(s.value, '-', ''), 4, 100)) = 1;

结果

result
---------------
ITO26218361281
SBC28791827135
SOT21092832917
INQ121092832917

Fiddle 查看实际情况。

相关问题