like による検索で完全一致するレコードが結果に含まれない - SQL

like による検索で完全一致するレコードが結果に含まれない現象と対処法を紹介します。

現象の確認

次のテーブルを用意します。
Products テーブル
idmodelnameclasscategoryprice
1C-XM01モーダンチェアホームチェア56000
2X-XD05ラージデスクオフィステーブル87000
3A-DA40ラウンドダイニングチェアホームチェア28000
4O-XX100ナチュラルオフィスオフィスチェア13800
5R-D400ラウンドダイニングテーブルホームテーブル128000
6R7000ウッドキャビネットオフィスその他32000
7B-200リネンベッドホームベッド184500
8B-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%'

以下の結果となります。レコードが検索結果に含まれます。
idmodelnameclasscategoryprice
8B-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文も以下の結果となります。
idmodelnameclasscategoryprice
8B-250ホワイトダブルベッドホームベッド324850

対処法3:末尾の空白を入れた式にする

末尾の空白文字を含めて、検索式の文字列に設定します。

次のSQL文を実行します。
select * from ProductsB where model like 'B-250                                                           '

実行結果は以下の結果となります。
idmodelnameclasscategoryprice
8B-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'

実行結果は以下の結果となります。
idmodelnameclasscategoryprice
8B-250ホワイトダブルベッドホームベッド324850
著者
iPentec.com の代表。ハードウェア、サーバー投資、管理などを担当。
Office 365やデータベースの記事なども担当。
最終更新日: 2023-10-19
作成日: 2023-10-19
iPentec all rights reserverd.