2016-07-25 13 views
4

特定の郵便番号に住んでいるすべての生徒をフェッチするSQLクエリを作成したいと思います。以下は私の質問です。SQLの空白を処理する方法

SELECT * FROM `students` AS ss WHERE ss.`postcode` LIKE 'SE4 1NA'; 

今の問題は、データベース内の一部のレコードが空白なしで保存されていることであるSE41NAのように、郵便番号であり、いくつかはまた、se41naまたはse4 1naのように、小文字であってもよいです。

このクエリでは、レコードの保存方法に基づいて異なる結果が得られます。私はこれを処理できる方法はありますか?

+0

**%**演算子を使用しようとしましたか? –

+0

'replace'を使って調べてみましょう...あなたが手作業で何かを変更していない限り、私は小文字の問題には疑いがあります。 – sgeddes

+0

@sgeddes mysqlの設定によっては(小文字でもかまいません)。 –

答えて

3

regexpを使用する方法の1つです。これにより、デフォルトで大文字小文字を区別しない一致が実行されます。

SELECT * FROM students AS ss 
WHERE ss.postcode REGEXP '^SE4[[:space:]]?1NA$'; 

[[:space:]]?は、オプションの空白文字と一致します。

REGEXP documentation MySQL

2

かどうかはケースの問題は、文字列/コラム/データベース/サーバーの照合によって異なります。

WHERE UPPER(ss.postcode) LIKE 'SE4%1NA' 

%は何も含まない任意の数の文字を、一致します。しかし、あなたが行うことによって、それを回避することができます。本当に必要なものはあまりにも一般的ですが、実際にはうまくいくはずです。

さらに重要な問題は、データベースでデータが入力されたことを検証しないことです。郵便番号が正しいようにアプリケーションを修正し、標準形式に従ってください。

0
SELECT * 
    FROM students AS ss 
WHERE UPPER(ss.postcode) LIKE SELECT REPLACE(UPPER('SE4 1NA'), ' ', '%'); ; 

'%'プレースホルダで置き換えられたスペースを使用することを提案します。またUPPERREPLACEとの組み合わせを使用しLIKEオペレータ

0
SELECT * FROM students AS ss 
    WHERE UPPER(REPLACE(ss.postcode, ' ', '')) = 'SE41NA' ; 
2

の両側ための上部にケースを変換します。

SELECT * 
FROM students s 
WHERE UPPER(REPLACE(s.postcode, ' ', '')) LIKE '%SE41NA%' 
+0

空白がテキストの途中にある場合は、1を超えると間違ったデータが返されます –

+1

空白は 'REPLACE'関数を使用して置き換えられます。まず – Matt

+0

ごめんなさい。私はそれに気付かない。しかし、私の意見によると、上部と置換えの性能が劣っているREGEXP –

関連する問題