WHERE条件の最終桁のスペースについて質問です

このQ&Aのポイント
  • あるテーブルのカラム(colA)に「1234」というデータがあるときに、(1)SELECT .... WHERE colA='1234'、(2)SELECT .... WHERE colA='1234 '、(3)SELECT .... WHERE colA='1234 '、(4)SELECT .... WHERE colA='12345'を実行すると、(1)だけOKで、他はNGとなると思い込んでいましたが、実際は、(2)と(3)も同じように検索されてしまいます。WHERE条件の最終桁のスペースは無視されるのでしょうか?
  • SQL-SERVER2005でのWHERE条件の最終桁のスペースについて質問です。テーブルの特定のカラムに対して、スペースが含まれる場合、そのスペースがどのように処理されるか知りたいです。
  • 過去に納品してきたお客様の件数を考えると、WHERE条件の最終桁のスペースの扱いについて不安になりました。SQL-SERVER2005において、スペースが含まれる場合、そのスペースは無視されるのでしょうか?
回答を見る
  • ベストアンサー

WHERE条件の最終桁のスペースについて質問です。

WHERE条件の最終桁のスペースについて質問です。 あるテーブルのカラム(colA)に"1234"というデータがあるときに、 (1)SELECT .... WHERE colA='1234' (2)SELECT .... WHERE colA='1234 '  (1234の後に半角スペース) (3)SELECT .... WHERE colA='1234 ' (1234の後に全角スペース) (4)SELECT .... WHERE colA='12345' を、実行すると、(1)だけOKで、他はNGとなると思い込んでいましたが、 実際は、(2)と(3)も同じように検索されてしまいます。 WHERE条件の最終桁のスペースは無視される? こういうものなのでしょうか? オンラインヘルプ等からは、それらしい情報が見つけられなかったのですが、もしこの辺の情報がわかるサイト等ご存知でしたら教えてください。 ちなみに、 SQL-SERVER2005(照合順序:Japanese_CI_AS) colAは、varchar(20) です。 p.s. 基本中の基本かもしれませんが、いままでずっと勘違いしていたので、過去の納品してきたお客様の件数を考えて恐ろしくなっています。(T.T)

質問者が選んだベストアンサー

  • ベストアンサー
  • todo36
  • ベストアンサー率58% (728/1234)
回答No.3

> ANSI_PADDING へえー! 知らなかった。 文字列を厳密に比較するときは、 WHERE colA COLLATE JAPANESE_BIN LIKE '1234 ' みたいに書かないといけないのかな?

tadajaa
質問者

お礼

>himajin100000さん。 ANSI_PADDING設定は影響しない。ですね。英語苦手です。(~_~;) あと比較演算子(=,<,>)とLike演算子でも、結果が変わってくるのですね... >todo36さん。 COLLATE(照合順序)まわりは、私も疑っていたのですが、今回の件では解決できなさそうでした。 まだ少ししか調べていませんが、『比較では後続の空白は無視されます』という規格(ANSI/ISO SQL-92)だと解釈しました。 で、最終桁の半角スペースも含めた検索がある場合には注意が必要だという事だと思います。 逆に、この仕様の方が便利な場合も多いと思いますし... CONVERT(varbinary, column_Name) などでバイナリ比較が、手っ取り早い解決策のようです。 今回はいろいろと良い勉強になりました。また、この辺のドキュメント類をきっちり確認する重要性を再認識いたしました。 みなさま、ありがとうございました。 以下に、テストした内容を記しておきます。 CREATE TABLE T1 (id int,colA varchar(10)) GO INSERT INTO T1 VALUES (1,'1234') INSERT INTO T1 VALUES (2,'1234 ') --最後に半角スペース INSERT INTO T1 VALUES (3,'1234 ') --最後に全角スペース GO SELECT * FROM T1 WHERE cola = '1234' --結果ID(1,2,3) SELECT * FROM T1 WHERE cola = '1234 ' --最後に半角スペース --結果ID(1,2,3) SELECT * FROM T1 WHERE cola = '1234 ' --最後に全角スペース --結果ID(1,2,3) SELECT * FROM T1 WHERE cola = '12345' --結果ID(なし) SELECT * FROM T1 WHERE cola like '1234%' --結果ID(1,2,3) SELECT * FROM T1 WHERE cola like '1234 %' --最後に半角スペース --結果ID(2,3) SELECT * FROM T1 WHERE cola like '1234 %' --最後に全角スペース --結果ID(2,3) SELECT * FROM T1 WHERE CONVERT(varbinary, colA) = CONVERT(varbinary,'1234 ') --最後に半角スペース --結果ID(2) SELECT * FROM T1 WHERE CONVERT(varbinary, colA) = CONVERT(varbinary,'1234 ') --最後に全角スペース --結果ID(3) GO DROP TABLE T1 GO 以上

その他の回答 (3)

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.4

> ANSI_PADDING へえー! 知らなかった。 文字列を厳密に比較するときは、 WHERE colA COLLATE JAPANESE_BIN LIKE '1234 ' みたいに書かないといけないのかな?

tadajaa
質問者

お礼

ご回答ありがとうございます。 先ほど質問締め切ろうかなと思いましたが、 具体例までいただきましたので、もう少し実験してみます。 追って、ご連絡いたします。

回答No.2

INF: How SQL Server Compares Strings with Trailing Spaces http://support.microsoft.com/kb/316626 関係ある? #検証はしてない。というかする気がない。

tadajaa
質問者

お礼

ご回答ありがとうございます。 URLまで教えていただきありがとうございます。 ANSI_PADDINGについての説明のようです。 この辺の設定は、あまり意識してこなかったので(汗) 関係があるのかもしれません。 少し調べてみます。

tadajaa
質問者

補足

その後、いろいろ調べた結果、自己解決しました。 ttp://msdn.microsoft.com/ja-jp/library/ms191529.aspx 『比較では後続の空白は無視されます』と明記してありました。 この際、照合順序やUniCodeなどもう少し勉強します。 解決の糸口やきっかけをいただきましたて、どうもありがとうございました。

  • hanmemomo
  • ベストアンサー率35% (205/580)
回答No.1

そのスペースは「カラム」に属するのであろうがなかろうが無関係ですよ 命令<1つ以上のスペース>オプション<1つ以上のスペース>オプション[以下必要な分のみ」 という書式で、データベースを管理するプログラムそのものは、 スペース区切りに分解してから処理する習性があり、 例としてスペースが間に100個?なんら問題はなかったりします。

tadajaa
質問者

お礼

ご回答ありがとうございます。 "SELECT"や"GROUP BY"など、各命令やオプションなどは、半角スペース(1個以上)で区切るという事ですね。 今回、それが'1234'や'1234 '(最終桁がスペース)のようにシングルクォーテーションで囲まれた文字列内で起こったので驚いています。 ちなみに、 WHERE colA=' 1234'(最初桁がスペース) では、正しい動き(検索されない)でした。

関連するQ&A

  • 文字型のwhere条件

    Oracleの初心者です、以下のSQL文は、助けてください。 Select * from RTM02AISM where TM02001 >= ' ' and TM02001 <= '゜゜゜゜゜゜゜゜゜゜゜' order by TM02001; TM02001はテーブルの中で11桁の文字型(CHAR)です。 文字型のwhere条件は、' 'と'゜゜゜゜゜゜゜゜゜゜゜' 組み合わせで、全てのTM02001列を表示できますか。 宜しくお願いします。

  • WHERE句の内部でWHEN

    いつもお世話になっております。 初歩的な質問で申し訳ありません。 SELECT X.COLA, X.COLB, Y.COLC FROM TABLE_X X, TABLE_Y Y WHERE X.COLA = Y.COLC AND WHEN X.COLB = "HOGEHOGE" THEN X.COLA > 100 ELSE X.COLA < 99; 以上のように COLBがある条件を満たす場合のみ、 WHERE句の条件を変更したいのですが、 上記の記述でよろしいのでしょうか? 現在手元にテストをできる環境が無い為、 初心者なりに机上で考えたのですが、 どなたかご教授いただければ幸いです。 よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • sql文のwhere条件について

    いつもおせわになります。 AM03001の型は20桁のcharacter型です。20 spacesより以上の条件で、すべてのAM03001の照会ができますか Select AM03001 from RAM03SHOH where AM03001 >= ' ' order by AM03001

  • ORACLEでwhere句の検索順序

    Oracle9i windows2000です。 以下のようなテーブルがあります。 table_a ----------------------- id   NUMBER(10,0) NOT NULL, sort   NUMBER(10,0) NOT NULL, name   VARCHAR(10), text   VARCHAR(255) この条件で、以下のふたつのSELECT文を発行した時、パフォーマンスが良いのはどちらですか? Oracleでは後ろから検索されると聞いたことがあるのですが本当でしょうか? ※idにプライマリキー、 id,sortにインデックスが貼ってあります。 (1)SELECT text FROM table_a WHERE id = 1 AND sort = 2 AND name = 'a' (2)SELECT text FROM table_a WHERE name = 'a' AND sort = 2 AND id = 1

  • whereで変数込みの抽出条件

    office2010,oracle 11g oracleからexcelへの抽出条件で、(1)と(2)は、それぞれで動作します。 (1)と(2)をor条件で接続したいのですが、どの様な書式になるか教えていただきたく。 Dim t As String t = Mid(Sheets("macro").Range("I1").Value, 1, 8)  I1セルには式=TEXT(NOW(),"yyyymmdd")が入っています。 (1) rs.Open "select * from USER where (A ='B' and C ='D' and E <>'F' and E <>'G' and not E like '使用不可%') or ( A ='B' and C ='H') ", cn, adOpenDynamic, adLockOptimistic, adCmdText (2) rs.Open "select * from USER where K ='L' and M >" & t, cn,adOpenDynamic,adLockOptimistic, adCmdText where (…) or (…) or (…) , cn,adOpenDynamic,adLockOptimistic, adCmdText という構成でエラーになるのです。 ※なお、条件分は、本来のものと変えています。

  • SELECT文で指定桁数分抽出する方法?

    SQL初心者ではじめて質問させていただきます。 SELECT文でテーブルの1つのカラムから上3桁と下2桁を抽出し、別なテーブルのカラムの上5桁をWhere句に条件を入れて検索はできますか? どなかたお分かりでしたら教えてください。 よろしくお願いします。

  • mysqldumpのwhereテーブル指定について

    約1億レコードあるテーブルをWhere条件で絞ってダンプしたいのですが、下記方法でダンプすると、DBのすべてのテーブルに対応してしまう為、エラーとなってしまします。 Where条件設定時に、テーブルを指定する事は可能でしょうか? OS:CentOS6.7(64Bit) Mysql Ver:5.1.73(yumインストール) テーブル構成 テーブル名:systemevents ID : int(10) DeviceTime:datetime FromHost: varchar(60) Message:txet ◎絞り込み条件 mysqldump -uroot -p --where 'DeviceTime between '開始日' And '終了日' and FromHost Like '%ホスト名%'' 上記を実行すると、syslog以外のテーブルにも実行されるようで、下記エラーが表示されます。 mysqldump: Couldn't execute 'SELECT /*!40001 SQL_NO_CACHE */ * FROM `SystemEventsProperties` WHERE DeviceTime between 2015/08/01 and 2015/08/31': Unknown column 'DeviceTime' in 'where clause' (1054) where 条件指定じに、テーブルを指定する事は出来ないか? mysqldumpのほかに、DB構造を含めたデータを出力する方法はないか? いずれかの方法をお教え頂けましたら幸いです。

  • 照合順序の競合を解決できません[SQL Server2005 ]

    今あるビューを生成しようとしてSQL文がうまく書けずに悩んでいます。ビューですが、副問い合わせを使用してある条件毎に異なるテーブルからデータを取得しようとして下記のようなSQLを書きました。 【SQL】 SELECT url, site_id, element1, element2, element3, element4, element5, element6, access_date, CASE element2 WHEN '1' THEN '' WHEN '2' THEN (SELECT title FROM table_b b WHERE b.site_id = a.site_id AND id = a.element4) WHEN '3' THEN (SELECT title FROM table_c c WHERE c.site_id = a.site_id AND id = a.element4) END AS page_title FROM dbo.view_access_log AS a このSQLを実行すると、「eqaul to の操作の"Japanese_CI_AS"と"Japanese_CS_AS_KS_WS"間での照合順序の競合を解決できません。」というエラーが表示されてしまいます。 ちなみに、上記SQLの "WHEN '3' THEN (SELECT title FROM table_c c WHERE c.site_id = a.site_id AND id = a.element4) "という部分を削除すると正常に動作します。 また、 ・view_access_log,table_b,table_c の照合順序は「Japanese_CI_AS」となっています。 ・副問い合わせに使用しているtable_b、table_cのidというフィールドはそれぞれint型になっています。 ・a.element4のフィールドの参照元のフィールドはvarchar(200)になっています。 どなたか識者の方、アドバイスお願い致します。m(__)m

  • 文字化けについて

    phpMyAdmin - 2.11.4 php エディタ shift-jis MySQL クライアントのバージョン: 5.0.45 localhost MySQL の文字セット: UTF-8 Unicode (utf8) MySQL の接続照合順序 sjis_japanese_ci テーブル 操作 レコード数 種別 照合順序 サイズ オーバーヘッド t01ken 47 MyISAM sjis_japanese_ci 2.9 KiB - 1 テーブル 合計 47 MyISAM sjis_japanese_ci 2.9 KiB 0 バイト 上記の環境にて phpでつくってみたら、 ヘッダー部など、htmlにうめこんでいる文字は通常どうりでたのですが、 php mysqlからかえってくる値で日本語の部分が????になります。 お分かりの方いらっしゃいますか? 勉強しながらしています。 どうか助けてください。

    • ベストアンサー
    • MySQL
  • SELECT文

    SELECT文で区分ごとに番号、番号名を表示させたいのですが。 T_テーブルに区分が1から5まであるのですが、select文一発で表示したいです。 番号は1~5,番号2は5~6まで表示したいのです。 区分は2の情報を取得する 1テーブルの情報を番号ごとに分けて表示したいです (例) 番号 番号名     番号1 番号名2 1 iti       5 go 2 ni      6 roku 3 san      7 nana 4 yon      8 hati T_テーブル情報 下記 区分 varchar(2) 番号 varchar(6) 番号名 varchar(16) SELECT T_テーブル.区分, T_テーブル.番号, T_テーブル.番号名, T_テーブル_1.番号, T_テーブル_1.番号名 FROM T_テーブル AS T_M_名称_1 INNER JOIN T_テーブル ON T_テーブル_1.区分 = T_テーブル.区分WHERE T_テーブル.区分 = '2'