[PR]ネットとスマホ まとめておトク!

DB上のデータの真ん中に全角スペースが入ってるのをうまく取得したいのですがどうしたらよいでしょうか?
例)
北海道 札幌市
青森県 つがる市
鹿児島県 鹿児島市
アメリカ フロリダ州
といった感じです。
セレクトするときにwhere = '北海道札幌市'と繋げて検索したいのですがどうすればよいでしょうか?
TRIMだと左右の空白しか排除出来ませんしDBのデータを一からやり直す訳にもいきません。
どうしたらよいのでしょうか?
SQLを発行するプログラムの関係上スペースの対処で悩んでいます。
もともとDBの設計ミスだと思いますがいまさら変えることも出来ないので・・・・

A 回答 (2件)

検索の速度がタイトならファンクション索引を作るのもありかもしれませんね。


create インデックス名 on テーブル名 ( replace(フィールド名,'_','') );
    • good
    • 1

where replace(フィールド名,'_','') = '北海道札幌市';


'_'の部分は、シングルコーティーションで囲われた全角スペースを思ってください。
ちなみに、そのフィールドに索引が付いていても、索引を使った検索が出来ませんので、それなりに遅いです。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q全角空白のTRIMができない・・・

文字列の前後の全角空白を除去するのに
trimが使えると思っていたのですが、できませんでした。
(半角なら取れるのですが・・・)

select trim(' あいうえお ') from dual;

何とか前後の全角空白を除去したいのですが、
何か方法はないでしょうか。

Aベストアンサー

こんな感じ。
select trim(' ' from ' あいうえお ') from dual

第2引数で消したい文字を指定できます。
select rtrim(ltrim(' あいうえお ',' '),' ') from dual

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

検索したいデータに空白がある時空白のない検索文字列で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を利用しています。

検索したいデータに空白がある時空白のない検索文字列でlike検索して
データがヒットするようにしたいです

col1

NTTデ ー タ
NTTデ - タ シ ス テ ム ズ
NTTデ ー タ ク オ リ テ ィ
日立製作所
IBM

このようなカラムのデータが入っているとします
※空白を含むデータや空白を含まないデータがあるとします

これを select * from table1 where col1 like '%NTTデータシス%'
とするとNTTデ ー タ シ ス テ ム ズが検索されるようにしたいと思っています。

replace関数を使って実現し...続きを読む

Aベストアンサー

>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 '%システムズ%'

>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デ -...続きを読む

Qスペースを検索したい

SQLで空白を検索するのは is nullだと思うのですが、
スペースを検索する方法ってありますか?
二つのパターンを区別して検索をかけたいのですが。

Aベストアンサー

「is null」は「null」を検索するものであって、
「空白を検索」するものではありません。

スペースの検索は、
<検索対象> like '% %'
です。
(%の間は全角スペース若しくは半角スペースです。
検索対象スペースに合わせてください。)

QMAX値を条件にデータを取得するには?

SQL文で困っています。
ご教授下さい。


下記のようなデータがあった場合、それぞれの区分毎に
年月が最大(最新)のデータを取得したいです。
(実際には1レコードにその他項目があり、それらも取得します。)
<検索対象データ>
区分 年月   金額
-----------------------------
A   200412  600
A   200503  560
B   200311  600
B   200508  1000
B   200504  560
C   200508  400
C   200301  1100


<取得したいデータ>

区分 年月   金額
-----------------------------
A   200503  560
B   200508  1000
C   200508  400

よろしくお願いします。

Aベストアンサー

テーブル名をXXXとすると次のようなSQLでよいと思います。(最善の方法かどうかは自信がないですが)

select B.* from (select 区分, max(年月) as 年月 from XXX group by 区分) As A
inner join XXX as B on A.区分 = B.区分 and A.年月 = B.年月
order by B.区分

Qデータベース内のテーブル名の取得

お世話になります。
初心者的な質問でしたらすいません。
SQL文にてデータベース内のテーブル名を
調べることができると聞いたことがあるのですが、
可能でしょうか。

もし、可能であれば、SQLの記述を教えてください。
お願いします。

Aベストアンサー

select * from tab;

私の場合、テーブル名だけ手っ取り早く知りたいとき、↑を打ちます。その他の情報も知りたいときは#2さんの仰るとおり、user_tablesで取得します。

QSQL文で右から1文字だけ削除するやり方

MySQL 5.1 利用中です。

テーブルに登録されている文字列が以下のようになっている場合
右から1文字だけを削除するSQL文を教えてください
右から「部とか課や/」が削除されるイメージです。

→SQL実行前

name
経理課
営業部
開発部
部門開発部
RアンドD/

→SQL実行後
name
経理
営業
開発
部門開発
RアンドD

よろしくお願い致します。

Aベストアンサー

nameのケツが「課」か「部」を調べるなら正規表現でしょうね

where name regexp '(部|課)$'

これを利用してupdateすればよいです

//データ作成
create table bumon (name varchar(30));
insert into bumon values('経理課'),('営業部'),('開発部'),('部門開発部'),('RアンドD');

//更新
update bumon set name=left(name,char_length(name)-1) where name regexp '(部|課)$'

Qsqlplusで表示が変なので、出力を整形したい。

いつもお世話になっています。

サーバにアクセスしてsqlplusで、
データを調べたいのですが、
出力形式が見づらくて困っています。

よくわからいのですが、
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------
1の値 2の値
3の値
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------

上記のように意味不明な形式で出てきます。

例えばこんな風に

select カラム1,カラム2,カラム3 from hoge;

カラム1 1の値
---------------------------
カラム2 2の値
---------------------------
カラム3 3の値

等のように分かりやすく表示できないでしょうか?

ちなみにOracle9iR2を使用しています。
sqlに関するツールは使用できないルールでして、あくまでsqlplusのコマンド上でみやすくしなければなりません。

分かりづらくですいませんが、皆さま、ご教授お願いします。

いつもお世話になっています。

サーバにアクセスしてsqlplusで、
データを調べたいのですが、
出力形式が見づらくて困っています。

よくわからいのですが、
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------
1の値 2の値
3の値
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
-----------------------...続きを読む

Aベストアンサー

SQLPLUSを起動して、

SQL>set linesize 列数

でどうだ。

SQL>show linesize

で確認ができる。

Q2つの項目が重複するレコードを抽出する方法はありますか?

MySQL4.1で既存データに対し複合キーを新しく設定したいのですが、

ALTER TABLE `test` ADD PRIMARY KEY (`a`,`b`)

としても重複データが存在する為、作成できませんでした。

10万件あるテーブルから重複するレコードを手動で削除したいのですが、aとbが重複しているレコードだけ抽出するSQL文はありますでしょうか?

Aベストアンサー

select * from `test`
where (a,b) in(
select a,b from `test`
group by a,b
having count(*)>1)

QSQL 複数テーブルのupdate

こんばんは。
複数テーブルの複数カラムをupdateしたいのですが、
うまくいかず困っています。
どなたか助けてください>_<

テーブルA(tableA)のoptionAというカラムと、
テーブルB(tableB)のoptionBというカラムを両方更新したいんです。

やりたい内容のイメージとしてはこんな感じです↓
update tableA a, tableB b
set a.optionA='OK', b.optionB='OK'
where a.student_id=b.student_id and a.name='山田';

どなたかご指導お願いいたします。

Aベストアンサー

where条件に別テーブルの結合を必要とするので、同時に更新したい・・・
ということならば、以下のようなupdate文を2回発行ではだめなんでしょうか?

update tableB b
set b.optionB='OK'
where exists(
select * from tableA a
where a.student_id=b.student_id and a.name='山田'
);

update tableA a
set a.optionA='OK'
where a.name='山田';

Qreplace関数で複数の文字の変換の仕方は?

よろしくお願いします。
WIN2000 oracle8.1.6

SELECT文でreplace関数を使って文字の変換をしたいのですが、複数の文字の変換は可能でしょうか?

やりたい事
aaabb→アアアbb
a-aabb→ア=アアbb

SELECT replace(001,'a','ア'),002,003,004 FROM ZAIKO

よろしくお願いします。

Aベストアンサー

やりたいことの検証できるサンプルを書かないと正しく理解できないし、
正しい答えかどうかの検証ができません。

あなたのやりたいことは、REPLACE関数でなく、TRANSLATE関数で..

SELECT TRANSLATE(001,'ab','アウ'),002,003,004 FROM ZAIKO

ような感じで出来るはずですよ。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報