2017-08-14 14 views
2

文字列が正しい形式に従っているかどうかを確認します。正しい形式は次のとおりです。SQLサーバーを使用した文字列形式の検証

大文字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

ハハ、私はあなたから巧妙な考えだと思った – scsimon

関連する問題