like による検索で完全一致するレコードが結果に含まれない現象と対処法を紹介します。
現象の確認
次のテーブルを用意します。
Products テーブルid | model | name | class | category | price |
1 | C-XM01 | モーダンチェア | ホーム | チェア | 56000 |
2 | X-XD05 | ラージデスク | オフィス | テーブル | 87000 |
3 | A-DA40 | ラウンドダイニングチェア | ホーム | チェア | 28000 |
4 | O-XX100 | ナチュラルオフィス | オフィス | チェア | 13800 |
5 | R-D400 | ラウンドダイニングテーブル | ホーム | テーブル | 128000 |
6 | R7000 | ウッドキャビネット | オフィス | その他 | 32000 |
7 | B-200 | リネンベッド | ホーム | ベッド | 184500 |
8 | B-250 | ホワイトダブルベッド | ホーム | ベッド | 324850 |
以下のSQL文を実行して検索します。
select * from ProductsB where model like 'B-250'
実行結果にはレコードは1つも含まれません。
id=8 に model列の値が"B-250" のレコードがありますので、含まれることを期待していましたが、含まれませんでした。
原因
テーブルの構造を調べます。
modelの型が nchar(64) であることが確認できます。
列名 | 型 |
id | int |
model | nchar(64) |
name | nchar(128) |
class | nchar(32) |
category | nchar(32) |
price | decimal(18, 0) |
likeで検索した場合、フィールドの空白も値として認識されるため、一見、完全一致に見えますが、末尾の空白が一致していないため、完全一致とは判定されません。
対処法1: 末尾を"%"のワイルドカードで一致させる
条件式の文字列の末尾に%を追加し、末尾の空白をワイルドカードで一致させる方法です。
select * from ProductsB where model like 'B-250%'
以下の結果となります。レコードが検索結果に含まれます。
id | model | name | class | category | price |
8 | B-250 | ホワイトダブルベッド | ホーム | ベッド | 324850 |
対処法2: TRIM, RTRIMを利用する
TRIM, RTRIMを利用して、元のフィールドの値から末尾の空白を除去したうえで一致を判定します。
select * from ProductsB where TRIM(model) like 'B-250'
select * from ProductsB where RTRIM(model) like 'B-250'
どちらのSQL文も以下の結果となります。
id | model | name | class | category | price |
8 | B-250 | ホワイトダブルベッド | ホーム | ベッド | 324850 |
対処法3:末尾の空白を入れた式にする
末尾の空白文字を含めて、検索式の文字列に設定します。
次のSQL文を実行します。
select * from ProductsB where model like 'B-250 '
実行結果は以下の結果となります。
id | model | name | class | category | price |
8 | B-250 | ホワイトダブルベッド | ホーム | ベッド | 324850 |
対処法4:フィールドの型を変更する
テーブルのフィールド型を変更します。
varchar 型に変更すると末尾の空白は含まれなくなります。
列名 | 型 |
id | int |
model | varchar(64) |
name | nchar(128) |
class | nchar(32) |
category | nchar(32) |
price | decimal(18, 0) |
select * from ProductsBV where model like 'B-250'
実行結果は以下の結果となります。
id | model | name | class | category | price |
8 | B-250 | ホワイトダブルベッド | ホーム | ベッド | 324850 |
著者
iPentec.com の代表。ハードウェア、サーバー投資、管理などを担当。
Office 365やデータベースの記事なども担当。
最終更新日: 2023-10-19
作成日: 2023-10-19