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

mysql:6844

From: Shinya Kawaji <Shinya Kawaji <kawaji@xxxxxxxxxx>>
Date: Sun, 12 Jan 2003 18:20:53 +0900
Subject: [mysql 06844] Re: 数字以外の文字を含む範囲検索

かわじ、です。


> DD9900      DD9950      BBBB
> 
> といったような商品番号の場合、商品検索で「DD9931」と入力した場合、
> やはり「BBBB」を拾わないといけません。
> 
> 数字だけ範囲検索するように、
> 
> SELECT hin_name FROM tbl_hin WHERE hin_fr >= DD9931 AND hin_to <= DD9931
> 
> とした場合、意図した検索結果にならない場合があるようです。


その意図した結果にならない場合がどのような場合か、お調べになりましたか?
その「例」が分からないので、以下適当な答えですが・・・

とりあえず、上記の WHERE 節の場合、BETWEEN を使うことも出来ます。
(以下の例では、比較関数の結果が真なので 1 を返しています)

mysql> select 'DD9931' between 'DD9900' and 'DD9950';
+----------------------------------------+
| 'DD9931' between 'DD9900' and 'DD9950' |
+----------------------------------------+
|                                      1 |
+----------------------------------------+
1 row in set (0.00 sec)


マニュアルの 6.3.1.2 にあるように、同じ位同士の比較では、
「数字 < 英字(大文字小文字を問わない)」で比較されます。
http://www.mysql.gr.jp/jpdoc/4.0/manual.ja_Reference.html#Comparison_Operators
(以下の例で、a は 9 と B の間にあることに注意)

mysql> select 'DDa931' between 'DD9900' and 'DDB950';
+----------------------------------------+
| 'DDa931' between 'DD9900' and 'DDB950' |
+----------------------------------------+
|                                      1 |
+----------------------------------------+
1 row in set (0.00 sec)

なのでもし、同じ位に文字と数字の両方表れる場合があるとして、(上の場合と
は逆に)文字よりも数字の方が「大きい」ということにしたいのであれば、
REPLACE などを駆使して、正しく比較できるように対象となる文字列を
変換する必要があります。


比較する文字列の長さが違う場合は以下の通り。
(以下の例で、DD9950 ではなく、DD995 であることに注意)

mysql> select 'DD9931' between 'DD9900' and 'DD995';
+---------------------------------------+
| 'DD9931' between 'DD9900' and 'DD995' |
+---------------------------------------+
|                                     1 |
+---------------------------------------+
1 row in set (0.00 sec)

文字列が短くても、(上から順に見て)同じ位の文字が大きい方が「より大きい」
ことになります。

なので、もしこういった「文字列の長さの違いで、意図した順番と前後する」の
でしたら、 LPAD や RPAD などを使って、全て同じ文字の長さにして
比較してはいかがでしょうか?


思いついた点は以上です。的外れかもしれませんが。

--
Shinya Kawaji



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

      6842 2003-01-12 17:30 [Koji Yamamoto <yamam] 数字以外の文字を含む範囲検索            
      6843 2003-01-12 18:00 ┣["3web" <dvh52252@xxx]                                       
      6845 2003-01-12 18:31 ┃┗[Koji Yamamoto <yamam]                                     
      6846 2003-01-12 19:37 ┃ ┣["3web" <dvh52252@xxx]                                   
      6852 2003-01-13 14:23 ┃ ┗[Hiromi Kurita <youji]                                   
->    6844 2003-01-12 18:20 ┣[Shinya Kawaji <kawaj]                                       
      6853 2003-01-13 23:35 ┃┗[Koji Yamamoto <yamam]                                     
      6855 2003-01-14 02:03 ┃ ┗[とみたまさひろ <tomm]                                   
      6851 2003-01-13 13:31 ┗["3web" <dvh52252@xxx]                                       
      6854 2003-01-13 23:49  ┗[Koji Yamamoto <yamam]