2

私は私が望む結果を返すこのコードを持っています:

SELECT CONCAT('#', id, ' ', firstname, ' ', lastname, ' (', company, ')') AS result FROM client_detail 

結果は次のとおりです。

#1 James Hadley (OpenBill)
#2 Lucinda Hadley (Make a Squish)

しかし、LIKEを使用して同じ文字列を検索しようとすると(上記の結果内の任意の場所で変数文字列を検索したい)、出力もエラーも表示されません。

SELECT CONCAT('#', id, ' ', firstname, ' ', lastname, ' (', company, ')') AS result FROM client_detail WHERE CONCAT('#', id, ' ', firstname, ' ', lastname, ' (', company, ')') LIKE '%jam%' ORDER BY id ASC

LIKEオペランドを使用するのは正しいですか、それとも結果内を検索するためのより良い/正しい方法がありますか?

4

2 に答える 2

1

MySQLのCONCATステートメントは、照合にシステムのデフォルトを使用します。テーブルがUTF-8として定義されているが、システムがlatin1である場合、LIKEステートメントでは大文字と小文字が区別される照合を選択できます。

LOWER (を使用HAVINGしてエイリアスを利用する)を使用して、大文字と小文字を区別しない一致を強制しますresult

SELECT CONCAT('#',id,' ',firstname,' ',lastname,' (', company, ')') AS result
  FROM client_detail 
HAVING LOWER(result) LIKE '%jam%'    
 ORDER BY id ASC

またはCOLLATIONを使用します(システムによって異なります)

...
HAVING result LIKE '%jam%' COLLATE latin1_general_ci
...
于 2012-10-12T17:31:16.673 に答える
0

コストのかかる操作である大文字と小文字を変換するのではなく、大文字と小文字を区別しない照合を強制的に使用できます。

SELECT   CONCAT('#', id, ' ', firstname, ' ', lastname, ' (', company, ')')
           AS result
FROM     client_detail
WHERE    CONCAT('#', id, ' ', firstname, ' ', lastname, ' (', company, ')')
           LIKE '%jam%' COLLATE utf8_general_ci
ORDER BY id ASC

ただし、テーブル内のすべてのレコードに対して連結と検索を実行する必要があるため、これは依然として非常にコストがかかります。インデックス付けは役に立ちません。

おそらく、クエリを言い換えて、インデックスをより有効に活用することができます(インデックスが存在する場合)。

SELECT   CONCAT('#', id, ' ', firstname, ' ', lastname, ' (', company, ')')
           AS result
FROM     client_detail
WHERE    firstname LIKE 'jam%' COLLATE utf8_general_ci
      OR lastname  LIKE 'jam%' COLLATE utf8_general_ci
      OR company   LIKE 'jam%' COLLATE utf8_general_ci
ORDER BY id ASC

このクエリは'jam'、各フィールド内のサブストリングではなく、各フィールドの先頭でのみ検索しますが。

于 2012-10-12T17:42:52.387 に答える