[前][次][番号順一覧][スレッド一覧]

mysql:8439

From: ML account <ML account <ml@xxxxxxxxxx>>
Date: Mon, 01 Dec 2003 18:29:03 +0900
Subject: [mysql 08439] Re: 50 音順検索について

 こんにちは。

聖 悠香 <youka_hijiri@xxxxxxxxxx>さんの
<BAY7-F32rxTjtRpeVPO0001f694@xxxxxxxxxx>
"[mysql 08437] 50 音順検索について"

> 【不明点】
> 「select * from DB名.テーブル名 where フィールド名 between "あ" and "お" 
> order by 挿入場所」
> とした場合『between "あ" and "お"』部分では“お”の言葉が検出されません。

 このSQL文のwhere句は文字列の範囲比較をやっています。つまり、

	where フィールド名 between "あ" and "お" 

は
	where フィールド名 >= "あ" and フィールド名 <= "お"

と等価です。まずこれが一点。


 文字列の比較の場合、相違する文字のコード以外に文字列の長さも関係します。

	"あ" < "い"		"あ"は"い"よりも評価値が小さな文字列
	"あ" < "あい"		"あ"は"あい"よりも評価値が小さな文字列

 よって、

	where フィールド名 between "あ" and "お"

なwhere句はフィールド「フィールド名」の先頭文字が"あ"、"い"、"う"、"え"
である場合、及び"お"の場合にマッチします。"おあ"等の先頭文字が"お"であっ
ても"お"単体でない場合にはマッチしません。これが二点目、そして

> とした場合『between "あ" and "お"』部分では“お”の言葉が検出されません。

の理由でしょう。実際には“お”は選択されていると思いますよ。選択されない
のは“お”以外の“お”で始まる言葉のレコードでしょう。


 期待する結果を得るにはwhere句の条件を、「先頭文字があ〜おである」とす
るか、「文字列"あ"から、"お"で始まる任意の文字列である」とする必要があり
ます。
 前者の「先頭文字があ〜おである」の例はかわじさんが[mysql 08438]で示さ
れた関数 ord()を使う方法もあれば、関数left()を使う方法もあるでしょう。フィー
ルド「フィールド名」がbinary付きで作成された場合のwhere句は、

	where left(フィールド名,2) between "あ" and "お"

binary無しならば、

	where left(フィールド名,1) between "あ" and "お"

です。3.23のMySQLで使用出来るかは知りませんが、正規表現を使うなら、

	where フィールド名 regexp "(あ|い|う|え|お).*"

となるでしょう。基本的に同じ考えの様々なバリエーションがあります。

 後者の「文字列"あ"から、"お"で始まる任意の文字列である」の場合のwhere
句は、例えばこんなものです。

	where フィールド名 >= "あ" and フィールド名 < "か"



    松枝知直    <tomom@xxxxxxxxxx>
            http://www.argus.ne.jp/~tomom/



[前][次][番号順一覧][スレッド一覧]

      8437 2003-12-01 16:12 [聖 悠香 <youka_hijir] 50 音順検索について                     
      8438 2003-12-01 16:33 ┣["Kawaji, Shinya" <ka]                                       
->    8439 2003-12-01 18:29 ┗[ML account <ml@xxxxx]