2017-05-08 15 views
-2

私は選択されたクエリで条件が必要です返す正しい郵便番号は、小文字か大文字か、空白か数字の間にスペースを入れずに入力しますか? 私は持っているデータベースが大文字いくつかのポストコードは数字の間にスペースを持ち、いくつかのポストコードは3つの数字を持っています。郵便番号の質問

+3

既存のコードを投稿できますか? –

+1

サンプルテーブルのデータを追加して問題を表示します。 (書式付きのテキストでもあります) – jarlh

+1

英国の郵便番号ですか? –

答えて

-1

デフォルトでは、sqlは大文字と小文字を区別しないため、スペースを心配する必要があります。

Declare @users table (name varchar(20), postcode varchar(10)) 
Declare @postcode varchar(10) = '5555 Aa' 

insert into @users 
values 
('aaa','5555AA'), 
('bbb','5555 AA'), 
('cccc', '5555 aa') 

select * from @users 
where replace(' ','',postcode) = replace(' ','',postcode) 

この設定を変更した場合、以下のクエリを試すことができます。

select * from @users 
where replace(' ','',postcode) = replace(' ','',postcode) COLLATE SQL_Latin1_General_CP1_CI_AS 

select * from @users 
where lower(replace(' ','',postcode)) = lower(replace(' ','',postcode)) 
+1

それは間違いなくPL/SQLではありません。 SQLでは "デフォルトでは大文字と小文字を区別しません" - SQL標準ではこれを具体的なDBMSと実際の照合に使用しています。 「スペース」は「大文字と小文字を区別する」かどうかとは関係がありません –

0

郵便番号のための公式の英国政府の正規表現は、この怪物です:

(GIR 0AA)|((([A-Z-[QVX]][0-9][0-9]?)|(([A-Z-[QVX]][A-Z-[IJZ]][0-9][0-9]?)|(([A-Z-[QVX]][0-9][A-HJKPSTUW])|([A-Z-[QVX]][A-Z-[IJZ]][0-9][ABEHMNPRVWXY])))) [0-9][A-Z-[CIKMOV]]{2}) 

残念ながら、Oracleはexcept構文をサポートしていないので、この種のものは出て[A-Z-[QVX]]です。しかし、入力を検証するためにregexp_like()コールを使用して簡単なバージョンを実行できます。

したがって、このような何か:

select valid_postcode 
from your_table 
where regexp_like (upper(:user_input) 
    , '((GIR 0AA)|((([A-Z][0-9][0-9]?)|(([A-Z][A-Z][0-9][0-9]?)|(([A-Z][0-9][A-HJKPSTUW])|([A-Z][A-Z][0-9][ABEHMNPRVWXY]))))(?)[0-9][A-Z]{2}))' 
and upper(translate(:user_input, 'A ', 'A') = valid_postcode 
/

多分upper(translate(:user_input, 'A ', 'A') = valid_postcodeがニーズには十分でしょうが。私は要件が鮮明ではないと思います。