質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Firebird

Firebirdは、オープンソースのリレーショナルデータベース管理システムです。オープンソースとしてBorland社が公開したInterBaseから派生したもので、MGAによる高度なトランザクション管理機能を持ちます。

Q&A

解決済

1回答

1580閲覧

【Firebird2.5】全角・半角を問わずLIKE検索を行うことはできますか?

shinoharat

総合スコア1674

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Firebird

Firebirdは、オープンソースのリレーショナルデータベース管理システムです。オープンソースとしてBorland社が公開したInterBaseから派生したもので、MGAによる高度なトランザクション管理機能を持ちます。

0グッド

0クリップ

投稿2018/11/09 09:28

編集2018/11/11 23:55

実現したいこと

Firebird2.5 を使った Windows アプリケーションを開発しているのですが、
全角・半角を問わずカタカナを検索、なおかつ部分一致で検索することは可能でしょうか?

例えば「テスト」で検索した場合、「テスト」と「テスト」の両方を抽出したいです。
「てすと」「デズド」などは抽出してもしなくても構いません。

Collation を試しましたが上手くいきません。
ご教授いただけますと幸いです。よろしくお願いいたします。

試したことと、その結果

Collation を利用しようと思い、以下のSQLで試してみました。

sql

1create database 'test.gdb' default character set UTF8; 2 3alter character set UTF8 set default collation UNICODE_CI_AI; 4 5create table person ( 6 id integer, 7 name varchar(50) 8); 9 10insert into person values (1, 'テスト'); 11 12insert into person values (2, 'テスト'); 13 14select * from person where name = 'テスト'; -- (A) 15 16select * from person where name like '%テスト%'; -- (B)

(A) では想定通り、id=1, id=2 の両方が抽出できました。

しかし、(B) では id=1 しか抽出できませんでした。

バージョン情報

Firebird2.5 (32bit版, Classic Server binary)

参考にしたURL

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Firebirdは触ったことも無いので、外していたらすみません。
以下ではどうでしょうか。

SQL

1select * from person where name collate UNICODE_CI_AI like '%テスト%'

追記

よく考えてみると大文字/小文字の識別が無いだけで全角/半角は同じにはならない気もします。
以下ではどうでしょうか。

SQL

1select * from person where upper(name) like '%テスト%'

投稿2018/11/13 16:36

編集2018/11/14 05:01
sazi

総合スコア25138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shinoharat

2018/11/14 04:04

ご回答いただきありがとうございます。 こちらの方法も試してみたのですが、やはり like だと "テスト" を抽出してくれませんでした。
sazi

2018/11/14 04:40

UNICODE_CI_AI 以外も試されましたか?
shinoharat

2018/11/14 06:50 編集

色々とありがとうございます。 下記ドキュメントを参考に、UTF8で使えるcollation(UCS_BASIC, UNICODE, UNICODE_CI, UNICODE_CI_AI)をすべて試してみました。 https://firebirdsql.org/refdocs/langrefupd25-collations.html また、教えていただいたupper関数も使用してみました。 ```sql -------------------------------------- -- 完全一致のみ抽出する場合 -------------------------------------- select * from person where name collate UCS_BASIC = 'テスト'; -- NG。「テスト」のみ。 select * from person where name collate UNICODE = 'テスト'; -- NG。「テスト」のみ。 select * from person where name collate UNICODE_CI = 'テスト'; -- OK。「テスト」「テスト」を抽出。 select * from person where name collate UNICODE_CI_AI = 'テスト'; -- OK。「テスト」「テスト」を抽出。 -------------------------------------- -- LIKE を使用した場合 -------------------------------------- select * from person where name collate UCS_BASIC like 'テスト'; -- NG。「テスト」のみ。 select * from person where name collate UNICODE like 'テスト'; -- NG。「テスト」のみ。 select * from person where name collate UNICODE_CI like 'テスト'; -- NG。「テスト」のみ。 select * from person where name collate UNICODE_CI_AI like 'テスト'; -- NG。「テスト」のみ。 -------------------------------------- -- LIKE + upper を使用した場合 -------------------------------------- select * from person where upper(name) collate UCS_BASIC like 'テスト'; -- NG。「テスト」のみ。 select * from person where upper(name) collate UNICODE like 'テスト'; -- NG。「テスト」のみ。 select * from person where upper(name) collate UNICODE_CI like 'テスト'; -- NG。「テスト」のみ。 select * from person where upper(name) collate UNICODE_CI_AI like 'テスト'; -- NG。「テスト」のみ。 ``` 結果としては、やはり「likeを使うと上手くいかない」状態です。
sazi

2018/11/14 06:57

like で使用している文字そのものの文字コードがどうなのかという事も考えられないでしょうか 適当なテーブルを使用して、 select * from (select 'テスト' as test_column from テーブル) where test_column like '%テスト%' などとして、状況を確認されてみては如何でしょうか。
shinoharat

2018/11/14 07:15

度々アドバイスいただき、本当にありがとうございます。 select * from (select 'テスト' test from rdb$database) where test collate UNICODE_CI = 'テスト'; だと「テスト」が抽出されましたが、 select * from (select 'テスト' test from rdb$database) where test collate UNICODE_CI like '%テスト%'; だと null が返ってきました。
sazi

2018/11/14 07:17

select * from (select 'テスト' test from rdb$database) where test collate UNICODE_CI like '%テスト%'; とか select * from (select 'テスト' test from rdb$database) where test collate UNICODE_CI like '%テスト%'; ではどうでしょう
sazi

2018/11/14 07:19

select * from (select upper('テスト') test from rdb$database) where test like '%テスト%'; も、試してください。
shinoharat

2018/11/14 07:35

... 'テスト' ... like '%テスト%' -- 抽出成功 ... 'テスト' ... like '%テスト%' -- 抽出失敗 ... upper('テスト') ... like '%テスト%' -- 抽出失敗 となりました。
sazi

2018/11/14 09:06 編集

upperは全角変換はしてくれていないみたいですね。 利用できるような記事を見つけたので提案したのですが、他のDBMSでもそんな都合のいい関数は無いので。 原因の特定はひとまず置いておいて対応するなら、半角を全角に変換するユーザー定義関数を作成するかですね。 ※translate()を使用すればそれほど大変ではないと思います。
shinoharat

2018/11/14 08:33

ありがとうございます。 半角カナを全角カナに変換するユーザー定義関数(UDF)を作成し、 select * from person where my_upper_func(name) like '%テスト%' という形で実装することにします。 色々とアドバイスいただき、本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問