2012-03-21 4 views
1

データベースのインポート後、データベースに保存された(時には複数の)空白で終わるダーティフィールドの行があります。何千もの他の行の中でそれらを見つけるために、空白で終わるMySQLフィールドの検索

SELECT * FROM `mytable` WHERE `dirtyfield` REGEXP ' $' 

しかし、それはゼロ行を返します。いくつかのきれいな行は、そのフィールド内の単語の間に単一のスペースを持っているので、あまり助けにはならない単一のスペースですべてを見つける

SELECT * FROM `mytable` WHERE `dirtyfield` REGEXP '[[:space:]]$' -- Zero Rows 
SELECT * FROM `mytable` WHERE `dirtyfield` REGEXP '[[.space.]]$' -- Zero Rows 
SELECT * FROM `mytable` WHERE `dirtyfield` REGEXP '[[.space.]]' -- Those with a space anywhere in the value 
SELECT * FROM `mytable` WHERE `dirtyfield` REGEXP '[[.space.]]{2}' -- Those with two spaces in a row 

:私は他のいくつかの他の結果とバリエーションを試してみました。最後のものはダーティ行の90%をキャッチしますが、最後にはスペースが1つしかないものは見逃します。フィールドの終わりを示すために$シンボルを使用する方法に何か問題がありますか?

MySQLのRIGHT()SUBSTRING()機能はフィールドの終わりを計算する際に空白を取り除くように見える:

SELECT * FROM `mytable` WHERE TRIM(`dirtyfield`)!=`dirtyfield` -- zero rows returned 

SELECT * FROM `mytable` WHERE RIGHT(`dirtyfield`)=" " -- Only returns one row that has " " for that field 
SELECT * FROM `mytable` WHERE SUBSTR(`dirtyfield`,-1)=" " -- Only returns one row that has " " for that field 

他の一つは、比較は動作しないかでした使用してみてください「汚れているフィールド」フィールドはVARCHAR(128)です。

編集:私はばかです。フィールドは空白で終わらず、複数の空白で終わり、コンマ(悪いCSVファイルからインポートされます)が続きます。

SELECT * FROM `mytable` WHERE RIGHT(`dirtyfield`,1)=',' 

そのクエリが見つかりました。私はカンマで区切られたビューでテーブルの出力を見ていて、カンマが二重になっていることに気付かなかった。

+0

を助けるかもしれないあなたはスペースがあることを確認しているところでダンプからいくつかのラインを投稿することができますか? – kappa

答えて

6

私はこれが正しいかもしれないと思う:

SELECT * FROM `mytable` WHERE `dirtyfield` REGEXP '[[.space.]]+$' 

あなたがしたい場合には、とにかく1以上で($)を終了フィールド(+)、スペース([[.SPACE]。]) と一致しますLIKE文と同じものは、以下のように簡単です。

... LIKE '% ' 

+0

いいえ、ゼロの行:( – MidnightLightning

+0

私はローカルテーブルでテストしていますが、あなたが選択しようとすると何が変わりますか(dirtyfield、 ''、 ' - SPACE--')?抽出された行には--SPACE- - ? – kappa

+0

私が考えることができる唯一のことは、スペースは実際には空白ではなく、おそらく空白やその他の印字不能な文字です。上記の答え**の提案は**機能するはずですので、おそらく試してみてください: 'SELECT * FROM mytable WHIERE dirtyfield REGEXP '\ s + $' '(バッククォートを取り除いてフォーマットしました)それは空白(タブ、改行など)で終わるフィールドを返します –

1

は、私はこれを試していないが、私は、これは

SELECT * FROM `mytable` WHERE `dirtyfield` LIKE "% " 
+0

いいえ、ゼロの行:(もし私が '好きな' foobar% "'を使うと、 "foobar"と "foobar"を持つ行が得られます。[^ 0-9a-zA-Z] $ ' "、" LIKE "foobar"とは対照的に、 "clean" "foobar"行だけを返します。しかし、それは逆に動作しないようですその空間を拾う。 – MidnightLightning

+0

いいえ、推奨されるクエリが機能するはずです。あなたの価値観は本当にあなたのものだと思っていますか? – Leigh

+0

心配しないで、値が期待した値と異なることを確認するために質問が更新されています。 – Leigh

0

はあなたが実際にそれでスペースを含む行を取得することを考えがあり、空白スペースで終わるエントリを見つけるために働くかもしれないと思うが、Webブラウザは」doesnのあなたのためにそれらをレンダリングする?

「2つ以上のスペース」という単語の値は、ブラウザで「2つの単語」のように見えます。

は試してみてください。

WHERE dirtyfield REGEXP '(^[[:space:]]|[[:space:]]{2,}|[[:space:]]$)' 

これは、それらのすべての行をフェッチする必要があります。ちょうどあなたが正しい行を得るかもしれないと考えてください、しかしそれはブラウザのためにそのように見えません。

3

同様の問題がありました。あなたは、トリム()で作られた、コンペア:

SELECT * FROM `mytable` WHERE TRIM(`dirtyfield`)!=`dirtyfield` 

doesntの仕事、しかし:

SELECT * FROM mytable where char_length(dirtyfield) > char_length(trim(dirtyfield)) 

が開始および/または終了時に両空間を持つ行を作業が行わ取得し、あなたを示していコンテンツ。文字カウントが機能します。非常に正直なところ私はtrim()がなぜ最初のクエリで直接比較されないのか分かりません。

これが役に立ちます。あなたのフィールドのように、この解決策は明らかに少し汚れています。

0

ねえ、私は似た何かをして、このページに入った後、クエリの下にチェックし、これは...

SELECT * FROM `mytable` WHERE `dirtyfield` LIKE "% %" 
関連する問題