Postgresのパターンマッチングについての質問です。

SELECT文でDB内を検索にかけ、「特定の列のデータ」が「検索単語」内に含まれる場合にその行を取得する、という正規表現を書きたいのですが可能でしょうか。(「特定の列のデータ」内に「検索単語」が含まれる、というのの逆になる点に注意してください。)

例)
DB内の特定の行には"TEST"という文字列が格納されているものとしますした場合、下記例では

検索データ
 1・・・"TEST_AAAA" ・・・検索にHITする
 2・・・"BBB_TEST" ・・・検索にHITする
 3・・・"CCC_TEST_CCC" ・・・検索にHITする
 4・・・"TE_DDD_ST" ・・・検索にHITしない
 5・・・"EEE" ・・・検索にHITしない

以上、よろしくお願いします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2006/09/11 11:35:44
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:takemori No.2

回答回数29ベストアンサー獲得回数2

ポイント44pt

WHERE '検索単語' like '%' || 列名 || '%';

でいいと思います。

実際試して出来ましたlol

id:n_maco2

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

正規表現に未熟なものでどうしてOKなのかわかりませんが、研究してみたいと思います。

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

2006/09/07 10:03:30

その他の回答8件)

id:kurukuru-neko No.1

回答回数1844ベストアンサー獲得回数155

ポイント5pt

PostGreSQLは、標準のSQLに準拠しているので

%: 任意の文字数の任意の文字

_: 1文字の任意の文字

をサポートしています。

http://www.atmarkit.co.jp/fnetwork/rensai/sql01/sql1.html

id:n_maco2

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

それは知っていますが、知りたいのは私が求めていることが可能かどうかです。

2006/09/07 10:00:27
id:takemori No.2

回答回数29ベストアンサー獲得回数2ここでベストアンサー

ポイント44pt

WHERE '検索単語' like '%' || 列名 || '%';

でいいと思います。

実際試して出来ましたlol

id:n_maco2

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

正規表現に未熟なものでどうしてOKなのかわかりませんが、研究してみたいと思います。

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

2006/09/07 10:03:30
id:kurukuru-neko No.3

回答回数1844ベストアンサー獲得回数155

ポイント5pt

添付忘れ

PostGreSQLのパターンマッチング仕様

正規表現を使う方法でも、又はorでも可能

PostGreSQL 7.3.4

http://kaiunix.cs.shinshu-u.ac.jp/Lesson/DataBaseIT/manual/7...

PostGreSQL 7.4

http://osb.sraoss.co.jp/PostgreSQL/Manual/PostgreSQL-7.4-ja/...

PostGreSQL 8.0

http://osb.sraoss.co.jp/PostgreSQL/Manual/PostgreSQL-8.0-ja/...

id:n_maco2

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

マニュアルなら見たのですがそれでもわからなかったもので・・・

2006/09/07 10:04:06
id:b-wind No.4

回答回数3344ベストアンサー獲得回数440

ポイント10pt

正規表現ではありませんが、特定の列を A とすると

SELECT A FROM TEST_TABLE WHERE 'TEST_AAAA' LIKE '%' + A + '%' ;

でどうでしょうか?

ただ、確実にインデックスは使えないので、データ量が多くなるとリニアに検索速度が遅くなると思います。

id:n_maco2

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

いただいた正規表現で試してみます。

> ただ、確実にインデックスは使えないので、データ量が多くなるとリニアに検索速度が遅くなると思います。

これは盲点でした・・・

ご注意ありがとうございます。

2006/09/07 10:05:20
id:vector_xenon No.5

回答回数113ベストアンサー獲得回数4

ちょいと疑問なのですが、

AA_BTESTC_DD

のような場合はHITさせるのでしょうか?

id:n_maco2

はい、HITさせたいです。

2006/09/07 13:38:03
id:b-wind No.6

回答回数3344ベストアンサー獲得回数440

ポイント38pt

SELECT A FROM TEST_TABLE WHERE 'TEST_AAAA' LIKE '%' || A || '%' ;


すいません前述のクエリは間違いで上が正解です。

文字列の結合演算子は || であることを忘れていました。

id:n_maco2

訂正ありがとうございます~

2006/09/07 13:38:41
id:kurukuru-neko No.7

回答回数1844ベストアンサー獲得回数155

ポイント10pt

table名: tbl カラム名: col

とした場合

TESTを含む行を抽出する。

# LIKE

select col from tbl where col like '%TEST%';

# POSIX( 大文字小文字区別なし )

select col from tbl where col ~* '.*TEST.*';

# POSIX( 大文字小文字区別あり )

select col from tbl where col ~ '.*TEST.*';

id:n_maco2

ふむふむ

2006/09/07 16:05:31
id:kurukuru-neko No.8

回答回数1844ベストアンサー獲得回数155

ポイント20pt

たびたびすいません逆の回答です。

#

select * from tbl where

upper('bc TEST ac')

SIMILAR TO '%'||upper(col)||'%';

LIKEでもできますがSIMILARの方がより

複雑な処理ができます。

id:n_maco2

SIMILARですか。初耳でした。ありがとうございます。

upperは大文字に統一して大文字小文字の区別をなくすためですね。確かに考えておかないといけない処理でした。

ありがとうございました~

2006/09/07 16:14:01
id:vector_xenon No.9

回答回数113ベストアンサー獲得回数4

ポイント20pt

>ちょいと疑問なのですが、

>AA_BTESTC_DD

>のような場合はHITさせるのでしょうか?

はい、HITさせたいです。

であれば、正規表現ではなくあいまいでできますね。


SELECT T.a FROM t_table T WHERE '検索文字列' LIKE '%' || T.a || '%'


対象が数値型なら

SELECT T.a FROM t_table T WHERE '検索文字列' LIKE '%' || TO_CHAR(T.a) || '%'

id:n_maco2

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

試してみたいと思います~

2006/09/07 18:04:32

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません