返回Alpha数字字符的特定组合



i有一个表,其中包含1000秒的行,带有α数字数据,例如:

select id from status_table
id
--
N #AN54055Z / MATTHEW
345 IN  EH86963D  JP Verified o
C N # CV08705Z  PP CONF / A
UI 45 Ty
1548 47 CN #DW40205J  VERIFIED AF
N #-CT77535S
78 78Thi OK
584 C yu N #AV10045A/DONNA MO
AH28395U  VERIF BK MAH
yu YUyu789 56

我想在结果中返回的alpha数字字符的独特组合:

例如:alpha alpha数字数字数字alpha

id
--
AN54055Z
EH86963D
CV08705Z
DW40205J
CT77535S
AV10045A
AH28395U

您可以使用PATINDEX检查模式,然后使用此返回值(模式开始的位置)作为SUBSTRING中的开始位置。由于模式是静态的,因此SUBSTRING

的长度也是如此
declare @t table (x varchar(256))
insert into @t values
('N #AN54055Z / MATTHEW'),
('345 IN  EH86963D  JP Verified o'),
('C N # CV08705Z  PP CONF / A'),
('UI 45 Ty'),
('1548 47 CN #DW40205J  VERIFIED AF'),
('N #-CT77535S'),
('78 78Thi OK'),
('584 C yu N #AV10045A/DONNA MO'),
('AH28395U  VERIF BK MAH'),
('yu YUyu789 56')
select d.* from(
    select 
        case 
            when PATINDEX('%[a-zA-Z][a-zA-Z][0-9][0-9][0-9][0-9][0-9][a-zA-Z]%',x) > 0
            then substring(x,PATINDEX('%[a-zA-Z][a-zA-Z][0-9][0-9][0-9][0-9][0-9][a-zA-Z]%',x),8)
            else null
        end as id
    from @t) d
where d.id is not null

您要寻找的称为正则表达式,也称为Regex,这是一种宏观语言,用于搜索文本中的模式。

以下是与2个alpha字符大写的正则表达式,然后是5个数字,然后是一个alpha字符。

[A-Z]{2}[0-9]{5}[A-Z]

您可以在WHERE语句中使用LIKE匹配模式,例如
WHERE MyField LIKE '%[A-Z]{2}%'。在SQL Server 2008上,您可以使用Patindex查找正则表达式的第一匹匹配的索引。

我现在无法运行测试SQL,但是我认为类似的事情可能有效:

SELECT
    PATINDEX ( '%([A-Z]{2}[0-9]{5}[A-Z])%', Id ) as TestPatIdx,
    CASE 
        WHEN PATINDEX ( '%([A-Z]{2}[0-9]{5}[A-Z])%', Id ) > 0 THEN
            SUBSTRING( MyField, PATINDEX ( '%([A-Z]{2}[0-9]{5}[A-Z])%' , Id ), 8 )
    END as TestResult,
    Id
FROM
    status_table

值得注意的是,如果这是您需要经常检索的数据,则可以创建一个计算的列第一列表,甚至可以在需要的情况下进行索引。注意我的代码和评论。

IF OBJECT_ID('tempdb..#t') is not null drop table #t;
CREATE TABLE #t
(
  -- the original column
  x varchar(256), 
  -- A computed column to extract that data ahead of time
  xx as        
  case 
    when PATINDEX('%[a-zA-Z][a-zA-Z][0-9][0-9][0-9][0-9][0-9][a-zA-Z]%',x) > 0
    then substring(x,PATINDEX('%[a-zA-Z][a-zA-Z][0-9][0-9][0-9][0-9][0-9][a-zA-Z]%',x),8)
  end persisted
);
-- optional index if you search on that column frequently
-- NOTE That you indexes can speed up SELECT statements but will impact inserts/updates/deletes
CREATE NONCLUSTERED INDEX nc_t_xx ON #t(xx);
--declare @t table (x varchar(256))
insert into #t (x) values
('N #AN54055Z / MATTHEW'),
('345 IN  EH86963D  JP Verified o'),
('C N # CV08705Z  PP CONF / A'),
('UI 45 Ty'),
('1548 47 CN #DW40205J  VERIFIED AF'),
('N #-CT77535S'),
('78 78Thi OK'),
('584 C yu N #AV10045A/DONNA MO'),
('AH28395U  VERIF BK MAH'),
('yu YUyu789 56')
SELECT x, xx 
FROM #t;

最新更新