2017-08-14 103 views
2

檢查字符串是否遵循正確的格式。正確格式如下:使用sql server驗證字符串格式

2個大寫字母; 2位數字; 1到30個字母字母數字(不區分大小寫) GB29RBOS60161331926819, GB29RBOS60161331926819A, GB29RBOS60161331926819B1

到目前爲止,這是我有...

declare @accountNumber varchar(1000) = 'GB99AERF12FDG8AERF12FDG8AERF12FDG8' 

select 
case when @accountNumber not like '[A-Z][A-Z][0-9][0-9][0-9a-zA-Z]{30}$' 
then 'ERROR' else null end 
+0

看起來像是在嘗試驗證IBAN號碼。你應該在應用層做到這一點,在那裏實現[所有檢查](https://en.wikipedia.org/wiki/International_Bank_Account_Number#Validating_the_IBAN)更容易。 – HoneyBadger

回答

3

首先,你的結構假設一個區分大小寫的排序規則。其次,SQL Server不識別{}$,因此您必須重複該模式。但是,你要超過30個字符,因此除了分裂的碎片可能是最好的解決辦法:

select (case when len(@accountNumber) not between 5 and 34 or 
        @accountNumber not like '[A-Z][A-Z][0-9][0-9]%' or 
        right(@accountNumber, 34) like '%[^A-Za-z0-9]%' 
      then 'ERROR' 
     end) 
+0

完美。這就是我一直在尋找的! – SVaidya

1

我認爲這應該工作...從John採取一些技巧。

declare @table table (i varchar(36)) 
insert into @table 
values 
('GR09xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'),  --30 x's 
('GR09xxxxxxxxxxxxxxxxxxxxxxxxxxxx'),  --28 x's 
('GR09xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'), --31 x's 
('Gx09xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'), --lower case 2'd letter 
('G509xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'), --digit second letter 
('GRg9xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')  --charcater first number (3rd index) 

select 
case 
    when i + replicate('a',case when 34-len(i) < 0 then 0 else 34-len(i) end) not like '[A-Z][A-Z][0-9][0-9]' + replicate('[a-zA-Z0-9]',30) 
then 'ERROR' else null end 
from @table 
+1

你比我做得更好。 +1 –

+1

HAHA,我認爲這是你的一個聰明主意 – scsimon