利用規約の変更について

column1~column3のデータに文字検索をしたいのですが、
下記のような不恰好なSQLしか思いつきません、、。

select * from tb where
  ( column1 like '%word1%' or column2 like '%word1%' or column3 like '%word1%' )
and ( column1 like '%word2%' or column2 like '%word2%' or column3 like '%word2%' )
and ( column1 like '%word3%' or column2 like '%word3%' or column3 like '%word3%' )

試しに、
select * from tb where
  ( ( column1 or column2 or column3) like '%word1%' )
and ( ( column1 or column2 or column3) like '%word2%' )
and ( ( column1 or column2 or column3) like '%word3%' )

と考えたのですが、これですと検索結果0件になってしまいます。
もっとスマートなSQL文がありましたら、ご教授頂きたいです。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

文字列を連結して、あたかも一つの列であるように見立てた上でLIKEとする。



ただし、3つのカラムのうちの一つでもNULLだと全体がNULLになる。

参考URLの5番目に対策あり。

参考URL:http://www.orangesoft.co.jp/RDB/rdb_memo_strcat. …
    • good
    • 0
この回答へのお礼

ありがとうございます!
concat関数を使えばいいのですね。
とても参考になりました。

お礼日時:2005/08/24 13:16

#1です。



select * from tb where (column1 || column2 || column3) like '%word1%'

ということです。(NULLの件、未考慮)

"|" はShift+¥で出ます。2回押してね。

ただし、
word1が "ABC"であって、
column1 = "A"
column2 = "B"
column3 = "C"
みたいなデータを拾ってしまうオマヌケもありうるので、
where (column1 || '/' || column2 ||'/' || column3)
のような「セパレータ」を挟むことも考慮してください。
もちろん「セパレータ」もword1に出現しないものですね。
    • good
    • 0
この回答へのお礼

回答ありがとうございます!

SQL文は以下にしたら成功しました。
select * from tb where
  ( concat( column1 , column2 , column3) like '%word1%' )
and ( concat( column1 , column2 , column3) like '%word2%' )
and ( concat( column1 , column2 , column3) like '%word3%' )

情報ありがとうございました!

お礼日時:2005/08/24 13:20

このQ&Aに関連する人気のQ&A

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

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

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

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

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

Q複数フィールド対してLIKE '% %' したい

SQL初心者なのですが、複数のフィールドをターゲットにしたフリーワード検索用のSQL文の書き方が解らず困っております。
例えば以下の様に"責任者"フィールドを限定して"田中"さんを探す事は出来るのですが、
----------------------------------------------------------------
SELECT * FROM `会員表` WHERE 責任者 LIKE '%田中%'
----------------------------------------------------------------
複数の、例えば以下の3つの
●責任者フィールド
●担当者フィールド
●顧客フィールド
全てを対象に一括で”田中”さんを検索したい場合、
どのように記述すれば良いのでしょうか?

どなたか有識者の方いらっしゃいましたら宜しくお願いします!!

Aベストアンサー

#1さんの方法はお勧めできません。

1)インデックスがきかない
2)セパレータを用いていない

1)に関しては、そもそも前後に%をいれた時点で、きかないので
あまり気にすることもないかもしれませんが、2)に関しては
たとえば、「責任者=吉田,担当者=中村」さんでもヒットします。
これはセパレータに適当な区切り文字を入れる必要があるでしょう。

まっとうに考えれば

(責任者 LIKE '%田中%'
OR 担当者 LIKE '%田中%'
OR 顧客 LIKE '%田中%')
とかじゃないですかねぇ

Q複数の条件での絞り込み検索の仕方

PostgreSQLで複数の条件での絞り込み検索をしたいのです。

テーブルには
発売日、商品名、入荷日
があります。
例えば
発売日が2007年5月1日から5月5日で、商品名に「○○」もしくは「××」もしくは「△△」が含まれており、入荷日が一番新しいもの
という条件で検索したいのです。

発売日だけの絞込みならBetweenですし、商品名だけならor、入荷日の最新だったらmaxを使えば個別には検索できるのですが、これをまとめて一行でやるにはどうしたらよいのかわかりません。
それぞれでandでつなげてみましたが、orの条件がうまく反映されず、一個目の○○だけが検索に引っかかってる状態です。
××や△△もひっかかるようにするにはどう記述したらよいのでしょうか。

Aベストアンサー

データ件数がどのくらいあるのかは分かりませんが、ユニークなキーもなく、likeの任意一致をorでつなぐという方法は、性能を出せませんよ?

select *
from t1
where 入荷日 in(
select max(入荷日)
from t1
where 発売日 between '2007-05-01' and '2007-05-05'
and (商品名 like '%○○%' or 商品名 like '%××%' or 商品名 like '%△△%')
)
and 発売日 between '2007-05-01' and '2007-05-05'
and (商品名 like '%○○%' or 商品名 like '%××%' or 商品名 like '%△△%')

Q複数キーワードを複数カラムに照会するSQL文?

頭の整理ができないので技術的なこともさることながら、SQL構築の考え方もうかがいたいのですが、
以下のテーブルに対して、スペース区切りで複数キーワードをAND条件で結ぶとして

ID MyCol1 MyCol2
--------------------------
1 いちご みかんジュース
2 ぶどう いちごみるく
3 みかん すいかジュース
4 すいか めろんソーダ
5 めろん ぶどうガム

検索フォームに「いちご ソーダ(※スペース区切り)」と入れたら、IDの1、2、4がマッチするようにしたいです。

スペース区切りで複数キーワードをAND条件で結ぶSQLは、以前教わりました。

http://oshiete.goo.ne.jp/qa/1212708.html

$sql = 'select * from t_url';
if ($title != '') {
$titles = array();
foreach (preg_split('/(\s| )+/', $title) as $word) {
array_push($titles, "MyCol1 like '%$word%'");
}
$sql .= ' where (' . implode(' and ', $titles) . ')';
}

今回の質問は、受け取った$titleを「MyCol1」だけでなく「MyCol1かMyCol2」にも同じ照会する方法をうかがいたいです。


検索キーワードが「いちご ソーダ」だったとき、MyCol1だけなら、

and (MyCol1 like '%いちご%' and MyCol2 like '%ソーダ%')

でよいわけですが、MyCol2はどう熱かったらいいのでしょうか。

and (MyCol1 or MyCol2 like '%いちご%' and MyCol1 or MyCol2 like '%ソーダ%')

みたいにできればよいのでしょうが。
PHPのコードも、上記のものだとMyCol1にしか照会がかかりませんが・・・

頭の整理ができないので技術的なこともさることながら、SQL構築の考え方もうかがいたいのですが、
以下のテーブルに対して、スペース区切りで複数キーワードをAND条件で結ぶとして

ID MyCol1 MyCol2
--------------------------
1 いちご みかんジュース
2 ぶどう いちごみるく
3 みかん すいかジュース
4 すいか めろんソーダ
5 めろん ぶどうガム

検索フォームに「いちご ソーダ(※スペース区切り)」と入れたら、IDの1、2、4がマッチするようにしたいです。

スペース区切りで複数キーワードをA...続きを読む

Aベストアンサー

and (concat(MyCol1,' ',MyCol2) like '%いちご%'
and concat(MyCol1,' ',MyCol2) like '%ソーダ%')
とでもすれば手っ取り早いと思いますが。

concat()・・・文字列をつなげます。

http://dev.mysql.com/doc/refman/5.1-olh/ja/string-functions.html#function_concat

具体的には、
ID Concat(MyCol1,' ',MyCol2)
--------------------------
1 いちご みかんジュース
2 ぶどう いちごみるく
3 みかん すいかジュース
4 すいか めろんソーダ
5 めろん ぶどうガム

となり、「いちご」と「ソーダ」をorでつなげば、1,2,4がでてきます。
(なお、andでつなぐと、質問にかかれた1,2,4でなく、1件もでてこないですが。)

なんで、,' ',をいれているかというと、

6 といち ごりら
とあると
Concat(MyCol1,MyCol2)
では、
6 といちごりら
となり、「いちご」が見つかってしまうためです。

and (concat(MyCol1,' ',MyCol2) like '%いちご%'
and concat(MyCol1,' ',MyCol2) like '%ソーダ%')
とでもすれば手っ取り早いと思いますが。

concat()・・・文字列をつなげます。

http://dev.mysql.com/doc/refman/5.1-olh/ja/string-functions.html#function_concat

具体的には、
ID Concat(MyCol1,' ',MyCol2)
--------------------------
1 いちご みかんジュース
2 ぶどう いちごみるく
3 みかん すいかジュース
4 すいか めろんソーダ
5 めろん ぶどうガム

となり、「いちご」と「ソーダ」...続きを読む

QMYSQLで全てのカラムから検索する。

tbというテーブルのbangというカラムに4が含まれていれば表示というのは
select * from tb where (bang) like '%4%' ;

という形になりますが、このtbテーブルにさらにname,tukiというカラムがあったとして
カラムに関係なくレコードのどこかに4が入っていれば抽出するというSQL文が書きたいです。

select * from tb where bang like '%4%' or name like '%4%' or tuki like '%4%' ;

と書くことで何とか今まではやってきたのですが、カラム数が増えてきてしまったので、ものすごく長いSQL文なってしまいました。
もう少しスマートにする方法はありませんか?

Aベストアンサー

>like '%4%'

のような前方後方一致はSQLの不得意分野で基本的にインデックスはきかないため、
なにをやっても高速化は期待できません

遅くても気にしないなら適当なセパレータを使って連結してからlikeを使えば
書式はすっきりします(さらにスピードはおちると思いますが・・・)


select * from tb where
concat_ws(char(0),bang,name,tuki) like '%4%;

ただし、この場合もbang,name,tukiは文字列型のカラムでnullがないことが前提になります
そうでない場合は例外処理をいくつかかます必要があるでしょう

QMySQLで複数フィールドから同一語を検索するには・・・

MySQLでフィールド数20程度のテーブルがあります。
全フィールドに対して、ある同一の語を検索するとき。

WHERE
field1 LIKE "%検索語%" OR
field2 LIKE "%検索語%" OR
...

と書いています。
しかし、同一の検索語を何度も書くのはスマートではありません。
何か良い方法をご存知でしたら教えてください。

Aベストアンサー

性能はどうでもよい、素人が遊びで使用する表でしょうか?

一つの表の異なる列に、同じパターン文字列のlike条件が何個も必要になるというのは異常です。まずは、表の列構成を見直しましょう。

例えば、(キー、情報区分、情報)という構成にすれば、like条件は1個にできます。

「個人的な遊びで使っており、性能はどうでもよく、取りあえず回避できればいい」というなら、変数を使用する方法があります。

set @ptn='%文字列%';
select * from t1
where c1 like @ptn or c2 like @ptn ~ or cn like @ptn;

Q複数カラム検索で、LIKE "%検索語%"

複数カラム検索をしたいと思い、リンク先の通り、
WHERE concat(field1,char(0),field2) LIKE "%検索語%"
としたらうまくいったのですが、
そのページに書いてあることが気になるので、教えてください
▽MySQLで複数フィールドから同一語を検索するには・・・ - MySQL - 教えて!goo
  http://oshiete.goo.ne.jp/qa/2634613.html

・char(0)て何でしょうか?

>%データ%は全件を検索するため効率うんぬんを論ずるような仕組みではない
・どういう意味でしょうか?
・全件検索する際は、LIKE検索を使わないのでしょうか? 全文検索エンジン(?)を利用するのでしょうか?
・全件検索しなければ(例えば2カラムだけ)、LIKE検索を利用しても良いのでしょうか?
・あるいは、データ規模が少なければ、LIKE検索を利用しても良いのでしょうか?

>本番ではこんなことはしませんがあくまでも遊びということで
・どういう意味でしょうか?
・concatで LIKE 検索を普通はしない、ということでしょうか?
・それとも、LIKE 検索で、char(0)などのセパレータを挟まない、ということでしょうか?
・あるいは、全件検索でLIKE検索を普通は使わない、ということでしょうか?

複数カラム検索をしたいと思い、リンク先の通り、
WHERE concat(field1,char(0),field2) LIKE "%検索語%"
としたらうまくいったのですが、
そのページに書いてあることが気になるので、教えてください
▽MySQLで複数フィールドから同一語を検索するには・・・ - MySQL - 教えて!goo
  http://oshiete.goo.ne.jp/qa/2634613.html

・char(0)て何でしょうか?

>%データ%は全件を検索するため効率うんぬんを論ずるような仕組みではない
・どういう意味でしょうか?
・全件検索する際は、LIKE検索を使わないのでし...続きを読む

Aベストアンサー

> ・char(0)て何でしょうか?
「検索語にはありえない文字」です。char(0)は、文字コード0の文字。以下の説明では\0と書きます。
例えば、検索語が"%おか%"で、field1="あいうえお"で、field2="かきくけこ"だった場合、
concat(field1,field2)は"あいうえおかきくけこ"となり、検索条件にマッチします。
ところが、concat(field1, char(0), field2) は、"あいうえお\0かきくけこ"となるため、
こうしておけば"%おか%"はマッチしない、ということになります。


> >%データ%は全件を検索するため効率うんぬんを論ずるような仕組みではない
> ・どういう意味でしょうか?

前後にワイルドカードをつけたLIKE 検索(いわゆる「部分位置検索」)は、効率が非常に悪いからです。
通常の検索(完全一致や範囲指定などによる絞り込み)では、DBにインデックスをつけることで、条件に該当するレコードを高速に抽出することができます。
(LIKEを使う場合でも、後ろにだけワイルドカードをつけた「データ%」のような、いわゆる「前方一致検索」は、インデックスが使えるので問題ありません。)

ところが、前にワイルドカードをつけた場合、インデックスが使えませんので、
DBの全レコードを1件ずつ読み込んで条件に合致するかチェックする必要がある、ということになります。
検索にはレコード数に比例した時間がかかるという、非常に効率が悪いものになってしまうのです。

> ・あるいは、データ規模が少なければ、LIKE検索を利用しても良いのでしょうか?

それが問題にならない程度の規模ならLIKEの前後ワイルドカード(部分一致検索)をしてもいいでしょう。

> ・全件検索する際は、LIKE検索を使わないのでしょうか? 全文検索エンジン(?)を利用するのでしょうか?

規模が大きくなった場合には、全文検索エンジンを使うのが基本です。

> ・全件検索しなければ(例えば2カラムだけ)、LIKE検索を利用しても良いのでしょうか?

「例えば2カラムだけ」というのが意味不明ですが、
問題はチェック対象のレコード数(行数)です。カラム数(列数)は問題になりません。
全件検索でなくても、チェック対象のレコード数が多い場合にはLIKE部分一致検索はしない方がいいでしょう。
LIKE検索以外の条件で、チェック対象が十分に絞り込めているなら、LIKE部分一致検索をしても大丈夫ということになります。


> >本番ではこんなことはしませんがあくまでも遊びということで
> ・どういう意味でしょうか?

上述のように性能が出せないので、大規模業務システムではそんなものは使わない、ということです。

> ・あるいは、全件検索でLIKE検索を普通は使わない、ということでしょうか?
LIKE検索でも、「あるカラムのみをチェック対象(LIKEの左辺)」とし、「頭には%をつけない前方一致検索」を行うのであれば問題ありません。

> ・concatで LIKE 検索を普通はしない、ということでしょうか?
> ・それとも、LIKE 検索で、char(0)などのセパレータを挟まない、ということでしょうか?
LIKE対象の前に%をつける「部分一致検索」は普通はしない、ということです。
さらにいうと、あと、カラムそのものではなく、concat した文字列に対してのLIKE 検索だと、「データ%」のような前方一致検索でも、左辺側にインデックスが使えませんので、やっぱり効率が悪くなりますので使えません。

> ・char(0)て何でしょうか?
「検索語にはありえない文字」です。char(0)は、文字コード0の文字。以下の説明では\0と書きます。
例えば、検索語が"%おか%"で、field1="あいうえお"で、field2="かきくけこ"だった場合、
concat(field1,field2)は"あいうえおかきくけこ"となり、検索条件にマッチします。
ところが、concat(field1, char(0), field2) は、"あいうえお\0かきくけこ"となるため、
こうしておけば"%おか%"はマッチしない、ということになります。


> >%データ%は全件を検索するため効率うんぬんを論...続きを読む

QSELECT文で、指定カラム以外の全カラムを一括指定って可能でしょうか

SELECT文で、指定カラム以外の全カラムを一括指定って可能でしょうか?
MYSQLサーバのバージョンは5.0.77です。

下記のように「*」を使用して指定テーブルの全カラムを表示する方法がありますが、
SELECT TableName.* FROM TableName

上記の逆で、指定テーブルの指定カラム以外の全カラムを一括指定って可能でしょうか?
例えば下記のような「^」みたいな、又は同等な書き方があれば良いなと思ってまして。
SELECT TableName.^ColumnName1 FROM TableName

ちなみに、下記のように一つ一つ表示したいカラムを指定する方法以外です。
SELECT TableName.ColumnName2 , TableName.ColumnName3 FROM TableName

よろしくお願いします。

Aベストアンサー

ない。
SQL文でそんなことをするより、メソッドとして作ればいいんじゃないですか。
だいたい、それ以外のカラムの数がわからないし、並びも不明だし。

#1に方と同じで
SELECT * from xxxx
なんてのは正気の人間は書きません。
カラムの数も位置も属性もわからないSQL文の結果をどうやって扱うのか。

QInner join と Left joinの明確な違いは?

Inner join と Left joinの違いがよくわかりません。
教えてください。

Aベストアンサー

出てくる結果が違います。

テーブル1のフィールド1に、






が、

テーブル2のフィールド1に、






が入力されている場合、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 LEFT JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3               3
4               NULL
5               NULL
6               NULL
の6レコードが出力されますが、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 INNER JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3               3
の3レコードしか出力されません。

出てくる結果が違います。

テーブル1のフィールド1に、






が、

テーブル2のフィールド1に、






が入力されている場合、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 LEFT JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3           ...続きを読む

Q3つの表の外部結合

表A、B、Cの3つがあり、Aのすべての行を出力したいと考えています。
外部結合を用いるのだとは思うのですが、3つの表に対して行う場合の
書き方がわからず困っています。
ご教授いただけないでしょうか?
select * from a,b,c
where a.商品ID =b.商品ID (+) and b.商品ID (+) =c.商品ID (+)
としてみましたが、うまくいきませんでした。

Aベストアンサー

ansi構文の趣旨からいえば、結合条件と絞り込み条件は分けて書くので・・

select *
from a
left join b on (a.商品ID =b.商品ID)
left join c on (b.商品ID =c.商品ID)
where a.年月 = 任意の値

と書くのが一般的でしょうね。

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&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報