• ベストアンサー

空白文字を含む文字列データの検索

検索したいデータに空白がある時空白のない検索文字列でlike検索して データがヒットするようにしたいです col1 NTTデ ー タ NTTデ - タ シ ス テ ム ズ NTTデ ー タ ク オ リ テ ィ 日立製作所 IBM このようなカラムのデータが入っているとします ※空白を含むデータや空白を含まないデータがあるとします これを select * from table1 where col1 like '%NTTデータシス%' とするとNTTデ ー タ シ ス テ ム ズが検索されるようにしたいと思っています。 replace関数を使って実現しようと思ったのですが SELECT REPLACE(col1,' ','') as col1 From table1 where col1 like '%システムズ%' これだとデータがヒットせず単純に表示するときに空白が削除されるだけです どうすれば空白を含むデータを検索することができるでしょうか できれば全角・半角両方を含む文字のデータでも検索できるようにしたいです SQLServer 2005を利用しています。

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

  • ベストアンサー
  • 3rd_001
  • ベストアンサー率66% (115/174)
回答No.1

>SELECT REPLACE(col1,' ','') as col1 From table1 where col1 like '%システムズ%' SELECT句とWHERE句は別物です。以下のようにWHERE句でREPLACEを指定してください。 ※SQLの解釈上、WHERE句が先に解釈されて対象データを特定しSELECT句の指示に従いデータを抽出します。 SELECT REPLACE(col1,' ','') as col1 From table1 where REPLACE(col1,' ','') like '%システムズ%' create table table1 ( col1 varchar(100) ); insert into table1 values('NTTデ ー タ'); insert into table1 values('NTTデ - タ シ ス テ ム ズ'); insert into table1 values('NTTデ ー タ ク オ リ テ ィ'); insert into table1 values('日立製作所'); insert into table1 values('IBM'); SELECT REPLACE(col1,' ','') as col1 From table1 where col1 like '%システムズ%'; col1 ------------------ (0 行処理されました) SELECT REPLACE(col1,' ','') as col1 From table1 where REPLACE(col1,' ','') like '%システムズ%'; col1 ------------------ NTTデ-タシステムズ (1 行処理されました) >できれば全角・半角両方を含む文字のデータでも検索できるようにしたいです SQL Serverの設定は「全角半角を区別する」になってますか? 区別しない設定なら、そのままでOKです。 区別する設定になっているならREPLACEを二度がけすればよいと思います。 where REPLACE(REPLACE(col1,' ',''),' ','') like '%システムズ%'

その他の回答 (1)

  • chaozux
  • ベストアンサー率40% (25/61)
回答No.2

これでいかがでしょうか。 select * from table1 where replace(replace(col1,' ',''),' ','') like '%NTTデータシス%'

関連するQ&A

  • インデックスを用いたbetween検索について

    Cで1~360000までのランダムな整数の列(col1)を含む100万件のデータを作成し(50MB弱)、 create table table1(・・・, col1 integer not null, ・・・); で作ったテーブルにload data infile文で挿入し、 create index index1 on table1(col1); でインデックスを作成しました。 select * from table1 where col1 between 1000 and 2000; といったような検索(約2500件ヒット)をしたいのですが、この検索ではインデックスを作らないテーブルのほうが速く検索できてしまいます。 select * from table1 where col1 between 100 and 200; のような検索(約250ヒット)ではインデックスの効果があり、高速検索ができますが。 環境はMySQL-5.0.26、ノートPC(256MB)、Fedora Core5、設定ファイルはMy-large.cnfを、ほぼそのまま使用しています。 上記のような少し大きめの検索範囲でもインデックスを用いた検索を改善する方法をご教授お願いします。何かのパラメータが決定的に足りないと思うのですが。

  • LIKEを使用したレコード抽出について

    OracleでLIKEを使用したレコード抽出で困っています。 あるテーブル(TAB_A)が以下のような属性だとします。 ------------- COL1 CHAR(5) COL2 CHAR(5) このとき、このテーブルに次のようにデータが格納されています。 COL1  COL2 -------------- ABC==  12345 [=]は便宜上1バイトスペースを表す このテーブルを対象として (1) SELECT * FROM TAB_A WHERE COL1 LIKE 'ABC%'; (2) SELECT * FROM TAB_A WHERE COL1 LIKE 'ABC==';   ([=]は便宜上1バイトスペースを表す) (3) SELECT * FROM TAB_A WHERE COL1 LIKE 'ABC'; というSQLを発行した場合に、いずれもレコードが抽出されてしまいます。(1)(2)の場合は当然だとは思うのですが、(3)でもレコードが抽出されることが理解できません。このようなことが起こり得るのでしょうか。

  • 検索条件について

    サーバ上にある以下のようにLOAD DATAでデータベースに登録し LOAD DATA INFILE "/home/abc/test001.csv" INTO TABLE test FIELDS TERMINATED BY ','; ENCLOSED BY '"'; 登録することはできたのですが個々テーブル毎では検索できますが 複数のテーブルで検索するとうまく検索できません。 【個々のテーブルは問題なし】 select * from abc where xyz=12345; select * from 123 where xyz=12345; これですと問題なく検索がヒットします。 【複数のテーブルで検索するとうまくいかない】 select * from abc,123 where abc.xyz=123.xyz; これですと検索してもヒットしません。 ちなみにabcのxyzにある項目を「'」で括ると検索できませんでした。 データは"1","12345"でセットしています。 LOAD DATAのやり方が悪いのでしょうか? どなたか教えていただけませんでしょうか。

  • 大文字/小文字の区別しないで検索したい場合

    データベース:ORACLE9i いつもお世話になっています♪ いきなり質問ですが、 例えばこういうデータがテーブルに 入っているとします。 ID  NAME ----------- 1 AAA1 2 BBB2 3 CCC3 ----------- そこで下記のSQLを実行するとBBB2はヒットしません。 select * from test_tbl where name like '%b%'; 大文字/小文字を区別しないで検索する方法はないでしょうか? よろしくお願いします♪

  • SQLで'ABC'をDBの'AB'にHIT

    sqlite3をVC++2013で扱っています。 もしかしたら、単純な方法があるのかもしれないので質問させてください。 DBに渡す文字が'ABC'でDB内のデータ'AB'にHITさせたいと思っています。 現状思いつく方法は select * from テーブル where キー like 'A%'; select * from テーブル where キー like 'AB%'; select * from テーブル where キー like 'ABC%'; と渡す文字を一文字ずつ増やして検索して row数が0以上の一番小さい数のデータを取得するという方法しか思いつかないのですが。 何か良い方法はありますでしょうか?

  • LIKEで検索

    MySQL 4.0.20 + PHP で名前が入ったテーブルよりLIKEを使って検索すると全然関係のない名前まで引っ張ってきます。 SELECT * FROM `lady` WHERE name LIKE 'らむ' 上記で検索すると 「とも」って名前まで引っ張ってきます。 SELECT * FROM `lady` WHERE name LIKE 'らな' だと 「るる」って名前も引っ張ります。 どうも「ら行」の検索がうまく出来ないようです。 何か回避方法はあるのでしょうか? よろしく御願いします

    • ベストアンサー
    • MySQL
  • where句のlikeと=の違いについて

    Postgresバージョン7.1.1からバージョン7.4.6にしたところ困ったことがあります。 テーブル名: hoge カラム名: col (←varchar(12)) データの中身はまるっきり同じ物が入っています。 という環境です。 そこで、SQLを実行するとバージョンによって結果が異なり不可解なのです。何か分かることがありましたら返事をお願いします。 [実行したSQL] select col from hoge where col = 'コル' select col from hoge where col like 'コル' [7.1.1] 共に、答えは一つだけ'コル'が表示されます。 [7.4.6] likeの時は'コル'が一つだけ表示されます。 =の時は何十個か出てきます。 以上、宜しくお願い致します。

  • 検索する文字列のデータが空の場合もその対象にしたい

    検索する文字列のデータが空の場合もその対象にするには、 SELECT * FROM `table` WHERE 1 AND `s1`='あああああ' AND `s2` IN('いいいいい',NULL) のようにするのでしょうか? 数値の場合はデータが無いのを0で表現すれば、 SELECT * FROM `table` WHERE 1 AND `m1`<=100 AND `m2`<=250 で良いですよね?

  • 文字検索、列をまとめたい

    以下のようなテーブルで「test_id」ごとに文字列(contents)をまとめたいのです。 [テーブル1] test_id | name 1 山田 2 佐藤 3 鈴木 [テーブル2] id | test_id | contents 1 1 東京は晴れです。 2 1 電車です。 3 2 埼玉は晴れです。 4 3 電車です。 検索処理でテーブル1と2を結合しの「name」を表示します。 contentsが「東京」「電車」でand検索をすると0件になり、or検索をすると3件(名前は2人)ヒットするのですが、 「東京」「電車」としたときtest_idの「1」をヒットさせたいのです。 test_idをgroup byでsum(数値)のように文字列を指定するには どのようにすればいいのでしょうか。concatを使ってみたのですが、 (contentsのみを指定したから?)結果は得られず、わかりませんでした。 $sql="SELECT id,test_id,concat(contents), FROM テーブル1 as t1 left join テーブル2 as t2 on t1.test_id=t2.test_id where $where group by t2.Itest_id"; MySQL:4.0.27です。 よろしくお願いします。

  • データ内の「\」や「'」を抽出するには

    データ内に「\」や「'」が含まれているデータを抽出するには SELECT * FROM table WHERE column LIKE '%\%' SELECT * FROM table WHERE column LIKE '%'%' で良いのでしょうか?

    • ベストアンサー
    • MySQL