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

时间:2017-03-08 18:46:48

标签: sql-server regex tsql

我有一个包含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

id
--
AN54055Z
EH86963D
CV08705Z
DW40205J
CT77535S
AV10045A
AH28395U

3 个答案:

答案 0 :(得分:1)

您可以使用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

答案 1 :(得分:0)

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

以下是一个正则表达式,它匹配2个字母大写,后跟5个数字,然后是一个字母字符。

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

您可以在LIKE语句中使用WHERE来匹配模式,例如
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

答案 2 :(得分:0)

值得注意的是,如果这是您需要经常检索的数据,您可以在表中创建计算列,甚至可以根据需要对其进行索引。请注意我的代码和评论。

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;