2017-03-08 82 views
0

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

還有的字母數字字符的獨特組合,我想回到我的結果:

例如:字母字母數字數字數字數字數字字母

id 
-- 
AN54055Z 
EH86963D 
CV08705Z 
DW40205J 
CT77535S 
AV10045A 
AH28395U 

回答

1

你可以用檢查花樣0,然後使用此返回值(模式開始的位置)作爲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 
+0

幹得好。請注意,您不需要在CASE語句中包含ELSE NULL; ELSE NULL是默認行爲。 –

+0

是的,這只是習慣,是明確的,易於閱讀@AlanBurstein – scsimon

0

長度你要找什麼叫regular expressions,也知道作爲正則表達式,這是一種用於搜索文本中模式的宏語言。

以下是一個正則表達式,它匹配2個字母大寫,然後是5個數字,然後是一個字母字符。

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

可以使用LIKEWHERE聲明匹配的模式,例如
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 
+0

你不能使用這種類型的語法與T-SQL:[A-Z] {2},而你需要這樣做[A-Z] [A-Z]。 –

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;